戻り値の受け取り方

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
よしき

戻り値の受け取り方

#1 投稿記事 by よしき »

GetPixel(ハンドル,x座標,y座標)
で、返ってきたRGB値はどのように受け取ればいいんですか?
DWord 型の変数で受け取るみたいなのですが・・・。
C1000
記事: 185
登録日時: 2006年5月07日(日) 17:16
お住まい: 宮城県
連絡する:

Re: 戻り値の受け取り方

#2 投稿記事 by C1000 »

DWord型の変数で受け取ります。

コード: 全て選択

Dim rgb As DWord
rgb=GetPixel(ハンドル,x座標,y座標)
Debug '変数rgbにRGB値が入ります。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: 戻り値の受け取り方

#3 投稿記事 by 7 »

> GetPixel(ハンドル,x座標,y座標)
> で、返ってきたRGB値はどのように受け取ればいいんですか?
> DWord 型の変数で受け取るみたいなのですが・・・。
もしかして、HSPで遊んだことありません?(笑)

C1000さんがレスしていますがちょっと違う結果の出力法を書きます。

コード: 全て選択

Dim rgb As DWord

	' GetPixel()関数の戻り値をDWrod型ローカル変数rgbに格納
	rgb=GetPixel(ハンドル,x座標,y座標)

	' DWord型ローカル変数rgbの値をデバッガに出力します。
	OutputDebugString(Str$(rgb))
rgb=GetPixel(ハンドル,x座標,y座標)っていう文を日本語に代えると、rgbの値をGetPixel()の値(戻り値)と同じにしろって感じでしょうか?。単純代入演算子っていう演算子を使って戻り値を変数に格納します。

GetPixel()関数で以下のようにすることはないと思いますが、戻り値は変数に格納しなくても使うことができます。

コード: 全て選択

If CLR_INVALID<>GetPixel(ハンドル,x座標,y座標) Then
	' GetPixel()関数が成功した場合の処理
End If
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 戻り値の受け取り方

#4 投稿記事 by NoWest »

> GetPixel(ハンドル,x座標,y座標)
> で、返ってきたRGB値はどのように受け取ればいいんですか?
> DWord 型の変数で受け取るみたいなのですが・・・。
DWord値からそれぞれのRGB成分を抽出する方法を知りたいということでは?

http://www.activebasic.com/forum/viewto ... %C3%CD#711
よしき

Re

#5 投稿記事 by よしき »

みなさんありがとうございます!

NoWest様、特にするどいですね!この質問をした時はまだ必要ではなかったのですが、今必要になってます。

それと、DWord型に入ってる数字をVal(buf$)でLong型に変えることはできましたか?
よしき

Re:すみません

#6 投稿記事 by よしき »

無駄な投稿すみません。
Val(buf$)で普通にできました。
卓漏
記事: 32
登録日時: 2005年11月30日(水) 06:38
お住まい: 静岡県の田舎町

#7 投稿記事 by 卓漏 »

DWord値からそれぞれのRGB成分を抽出する方法を知りたいということでは?
たとえば、
rgb = RGB(123,45,67)
というRGB値から赤緑青のそれぞれの値を取り出すなら、
変数「R」 = 123
変数「G」 = 45
変数「B」 = 67
という値がそれぞれ取得できます。

konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#8 投稿記事 by konisi »

>>卓漏s
NoWest氏の張ったリンク先で、イグトランスsが方法を明示済みですよ。

コード: 全て選択

Const GetRValue(rgb) = (rgb And &hff)
Const GetGValue(rgb) = ((rgb >> 8) And &hff)
Const GetBValue(rgb) = ((rgb >> 16) And &hff)
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
よしき

少し話がずれてしまうのですが・・・

#9 投稿記事 by よしき »

下のプログラムでウィンドウ「Bit」に線が書けるのですが、これをBitMapかなにかで保存できるようにしたいのですが、どうすればいいのですか?


Dim hDCBit As HDC
Dim x As Long '読み取るピクセル&グラフのX座標
Dim hMemBitDC As Long 'メモリ内 デバイスコンテキストのハンドル


Sub Bit_IDM_SEE_MenuClick()
hDCBit=GetDC(hBit)
For x=1 to 200


LineTo(hDCBit,x,110)
Next x

End Sub

メモリ内デバイスコンテキストを利用すればできるような気がするのですが、よくわからないのです…。
よしき

たびたびすいません

#10 投稿記事 by よしき »

上のコードはまちがいです。
こちらです。
間違いばかりですみません…。

コード: 全て選択


'-----------------------------------------------------------------------------
'  イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。

'ビットマップのファイル名
Dim FileName As String

'「開く」ダイアログの拡張子フィルター
Dim BitmapFileFilter As String
BitmapFileFilter = "ビットマップ ファイル(*.bmp)" + Chr$(0) + "*.bmp" + Chr$(0) + _
                   "すべてのファイル(*.*)" + Chr$(0) + "*" + Chr$(0)


  
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数

Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
	' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。

	' イベントプロシージャの呼び出しを行います。
	MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function


'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。

Sub MainWnd_Destroy()
	Monochrome_Judge_DestroyObjects()
	PostQuitMessage(0)
End Sub

Sub MainWnd_IDM_OPEN_MenuClick()
    Dim ofn As OPENFILENAME
    Dim buffer As String

    'ファイル名を取得
    ofn.lStructSize=Len(ofn)
    ofn.hwndOwner=hMainWnd
    ofn.lpstrFilter=StrPtr(BitmapFileFilter)
    ofn.nFilterIndex=1
    buffer=ZeroString(MAX_PATH)
    ofn.lpstrFile=StrPtr(buffer)
    ofn.nMaxFile=MAX_PATH
    If GetOpenFileName(ofn)=0 Then Exit Sub

    FileName=ofn.lpstrFile

    '再描画要求を出す
    InvalidateRect(hMainWnd,ByVal 0,1)
End Sub


Sub MainWnd_Paint(hDC As Long)
    Dim hBmp As Long              'ビットマップ ハンドル
    Dim hMemDC As Long            'メモリ内 デバイスコンテキストのハンドル
    Dim BitmapReport As BITMAP    'ビットマップ情報を格納するための構造体
    Dim dx As Long, dy As Long    'ウィンドウサイズとクライアント領域サイズの差

    'ファイルが開かれていない場合は抜け出す
    If FileName="" Then Exit Sub

    'ビットマップをロード
    hBmp=LoadImage(GetWindowLong(hMainWnd, GWL_HINSTANCE), FileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)
    If hBmp=0 Then
        MessageBox(hMainWnd, "ビットマップのオープンに失敗", "BmpViewer", MB_OK)
        Exit Sub
    End If

    'ビットマップのサイズを取得
    GetObject(hBmp, Len(BitmapReport), BitmapReport)

    'ウィンドウサイズとクライアント領域サイズの差を計算
    Dim rc_Window As RECT, rc_Client As RECT
    GetWindowRect(hMainWnd, rc_Window)
    GetClientRect(hMainWnd, rc_Client)
    dx = (rc_Window.right - rc_Window.left) - (rc_Client.right - rc_Client.left)
    dy = (rc_Window.bottom - rc_Window.top) - (rc_Client.bottom - rc_Client.top)

    'ウィンドウサイズをビットマップのサイズにあわせる
    MoveWindow(hMainWnd, rc_Window.left, rc_Window.top, BitmapReport.bmWidth+dx ,BitmapReport.bmHeight+dy, 1)

    hMemDC=CreateCompatibleDC(hDC)  'メモリ内にデバイスコンテキストを作成する
    SelectObject(hMemDC, hBmp)      'ビットマップを選択

    'ビットマップを描画
    BitBlt(hDC, 0, 0, BitmapReport.bmWidth, BitmapReport.bmHeight, hMemDC, 0, 0, SRCCOPY)






Dim hDCBit As HDC
Const GetRValue(rgb) = (rgb And &hff)
Dim r As Long
Dim x As Long
Dim rgb As DWord
hDCBit=GetDC(hBit)
For x=1 to 480

	rgb=GetPixel(hMemDC,x,240)

r=GetRValue(rgb)


LineTo(hDCBit,x,r)
Next x

End Sub
これで白黒画像の黒さグラフを作っているのですが、グラフの保存がなんともできません。それでさっきの質問「BitMapかなにかで保存できるようにしたいのですが、どうすればいいのですか?」です。できませんか?
卓漏
記事: 32
登録日時: 2005年11月30日(水) 06:38
お住まい: 静岡県の田舎町

#11 投稿記事 by 卓漏 »

> NoWest氏の張ったリンク先で、イグトランスsが方法を明示済みですよ。

∑(゜∀゚)何と! → ○| ̄|_ ・・・・自分も使おう・・・・。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#12 投稿記事 by konisi »

バグが潜んでいるかも知れないので注意して使ってほしいのですが、下のような関数で試してみてください。 定義:SaveBmp(Dest As String,hDC As HDC,bx As Long,by As Long,x As Long,y As Long)(hWnd As HWND)
Dest:出力するファイル名を、拡張子bmpを付加した状態で指定してください。
hDC:GetDC関数などで得られる、デバイスコンテキストを指定してください。
bx:x座標のベースを指定してください。(Step付きLine関数のxと同義)
by:y座標のベースを指定してください。(Step付きLine関数のyと同義)
x:保存される画像の幅を、ピクセル単位で指定してください。
y:保存される画像の高さを、ピクセル単位で指定してください。
hWnd:xまたはyが0の時に使われます。省略可能です。

xまたはyが0の時、座標(bx,by)から右下隅までを保存します。この時、ウインドウの大きさをウインドウハンドルhWndから計算するため、xまたはyが0になる時は必ずhWndを指定してください。

返り値:なし
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
よしき

無知ですみません…

#13 投稿記事 by よしき »

konisi様本当にありがとうございます。

…なのですが、この関数を実行させるにはどうすればいいんでしょうか?debugをこの関数に入れておいたのですが、一度も止まりませんでした。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#14 投稿記事 by konisi »

例えば、

コード: 全て選択

SaveBmp("1.bmp",GetDC(hMainWnd),0,0,0,0,hMainWnd)
と使います。
これを、自前関数最後のNext xとEnd Subの間に入れてみてください。(RePaintイベント内で入れるべきものではない気がするが。出来れば、メニュー内に「保存」[IDM_SAVE]を作って、そこから呼び出した方がいいかと思います。)

要するに実行したければ呼び出せばいいんです。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
よしき

#15 投稿記事 by よしき »

ありがとうございます。しっかりと「保存」[IDM_SAVE]でよびださせるようにしました。
と、先ほどの関数で、ファイルにきちんと名前をつけて開いて最後に閉じているのはわかったのですが、どこに保存されるのですか?また、その指定はできますか?
返信する