戻り値の受け取り方

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 戻り値の受け取り方

Re

by よしき » 2006年8月19日(土) 17:44

親切にありがとうございます。なんとなく(?)理解できました。

SaveBmp関数の第一引数は普段あまり使わない名前がよかったんですね。
見事に上書きしてました。(笑)

by konisi » 2006年8月19日(土) 02:45

SaveBmp関数の、第一引数で保存するファイル名を指定します。
たまたま重なったんですかね?上書きしてしまったようです。

関数内のOpen文でファイルを開いています。じっくりと読んで行けば分かりますよ。

ビットマップとして保存する時、ビットマップファイルにはヘッダが付き、その部分で幅や高さ、使う色のモード(白黒とか256色とか)等を色々指定してやりますが、説明は面倒なので省略。

またまたはやとちりでした

by よしき » 2006年8月19日(土) 00:30

長時間の検索の結果、グラフ化の前の画像があるファイルにあるのが発見されました。早とちり申し訳ございませんでした。

元の画像と同じファイルに保存するということなのでわざわざ保存場所の指定することも不要でした。



…ですがやっぱり疑問がのこります。先ほどの関数のどのあたりでファイルのパスを指定しているのですか?

by よしき » 2006年8月19日(土) 00:15

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

by konisi » 2006年8月18日(金) 23:28

例えば、

コード: 全て選択

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

要するに実行したければ呼び出せばいいんです。

無知ですみません…

by よしき » 2006年8月18日(金) 23:14

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

…なのですが、この関数を実行させるにはどうすればいいんでしょうか?debugをこの関数に入れておいたのですが、一度も止まりませんでした。

by konisi » 2006年8月18日(金) 18:09

バグが潜んでいるかも知れないので注意して使ってほしいのですが、下のような関数で試してみてください。 定義: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を指定してください。

返り値:なし

by 卓漏 » 2006年8月18日(金) 18:06

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

∑(゜∀゚)何と! → ○| ̄|_ ・・・・自分も使おう・・・・。

たびたびすいません

by よしき » 2006年8月18日(金) 16:16

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

コード: 全て選択


'-----------------------------------------------------------------------------
'  イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [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かなにかで保存できるようにしたいのですが、どうすればいいのですか?」です。できませんか?

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

by よしき » 2006年8月18日(金) 14:58

下のプログラムでウィンドウ「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

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

by konisi » 2006年8月18日(金) 08:59

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

コード: 全て選択

Const GetRValue(rgb) = (rgb And &hff)
Const GetGValue(rgb) = ((rgb >> 8) And &hff)
Const GetBValue(rgb) = ((rgb >> 16) And &hff)

by 卓漏 » 2006年8月18日(金) 07:05

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

Re:すみません

by よしき » 2006年8月18日(金) 00:07

無駄な投稿すみません。
Val(buf$)で普通にできました。

Re

by よしき » 2006年8月18日(金) 00:03

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

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

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

Re: 戻り値の受け取り方

by NoWest » 2006年8月17日(木) 21:32

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

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

ページトップ