お久し振りです。
超ど素人のHOLYです。
今回は、『画像』についてなのですが・・・
イメージボックスに画像を表示させようと思い、頑張ったのですが、
CreateCompatibleDC関数でつまずいてしまいました。
ABの本は持っているので、『BMPビューワを作ろう』の回を参考にしたのですが、
CreateCompatibleDCのデバイスコンテキストの作成の部分がどうしても出来ません。
本には、
CreateCompatibleDC(hDC)
っと書いてあったので、まねしてみたら
『hDC』は無効な識別です
っとエラーが出てきます。
変数などの定義はなかったと思います。
もしあればそこは指摘してくださいです。
どうすれば解決できるか教えて下さい。
また、素人の僕でも、簡単に画像を扱える方法があればそのサンプルのコードも
御願いします。
やりたいことは、
BMPリソースの中の画像を表示したいのです。
分かりにくいかもしれませんが、優しく御願いします(_ _)
デバイスコンテキスト
ABの本は持っていないのですが、
描画対象のウインドウハンドルをhWndとするときにとすればいけると思います。
最後にReleaseDCで開放するのを忘れないで下さい。
AB4を使用しているなら
http://www.activebasic.com/forum/viewtopic.php?t=672
http://www.activebasic.com/forum/viewtopic.php?t=839
AB3なら
http://www.activebasic.com/forum/viewtopic.php?t=533
を参照してみてください。
追記
もしそのCreateCompatibleDC関数が使われてるのが元の本ではMainWnd_Paint関数内なら、
その引数にhDCが指定されていると思います。
そのhDCの値の取得・開放に関する部分をCallback.wbpから抜粋するととなっています。GetDCで上手くいかなければこちらも試してみてください。
描画対象のウインドウハンドルをhWndとするときに
コード: 全て選択
Dim hDC As HDC
hDC=GetDC(hWnd)
最後にReleaseDCで開放するのを忘れないで下さい。
AB4を使用しているなら
http://www.activebasic.com/forum/viewtopic.php?t=672
http://www.activebasic.com/forum/viewtopic.php?t=839
AB3なら
http://www.activebasic.com/forum/viewtopic.php?t=533
を参照してみてください。
追記
もしそのCreateCompatibleDC関数が使われてるのが元の本ではMainWnd_Paint関数内なら、
その引数にhDCが指定されていると思います。
そのhDCの値の取得・開放に関する部分をCallback.wbpから抜粋すると
コード: 全て選択
Dim ps As PAINTSTRUCT
Dim hDC As HDC
hDC=BeginPaint(hWnd,ps)
MainWnd_Paint(hDC)'MainWnd_Paint関数呼び出し
EndPaint(hWnd,ps)
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
全体的な流れなら以下のようになります。
IDEの再描画命令で書く場合
IDEの再描画命令で書く場合
[ここをクリックすると内容が表示されます]
その他の箇所で書く場合
[1] 引数のhDCからCreateCompatibleDC関数を呼び出してメモリDCを作成
[2] 作成したメモリDCにロードしてあるビットマップを選択させる
[3] メモリDCからウィンドウのDC(hDC)にコピー(BitBlt)
[4] メモリDCに設定したビットマップを解除([2]の戻り値を選択させる)
[5] メモリDCを破棄
[2] 作成したメモリDCにロードしてあるビットマップを選択させる
[3] メモリDCからウィンドウのDC(hDC)にコピー(BitBlt)
[4] メモリDCに設定したビットマップを解除([2]の戻り値を選択させる)
[5] メモリDCを破棄
[ここをクリックすると内容が表示されます]
ソースはこんな感じになります。
[0] ウィンドウのDCを取得
[1]~[5] 上記と同じ処理
[6] ウィンドウのDCを解放
[1]~[5] 上記と同じ処理
[6] ウィンドウのDCを解放
[ここをクリックすると内容が表示されます]
コード: 全て選択
Sub MainWnd_Destroy()
'ビットマップがロードされていれば破棄する
If 0 <> hBmp then DeleteObject(hBmp)
GDI_Sample_DestroyObjects()
PostQuitMessage(0)
End Sub
Dim hBmp As HANDLE
Dim BmpInfo As BITMAP
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
'===== イメージのロード
hBmp = LoadBitmap(GetModuleHandle(0), IDB_IMAGE1)
'<外部ファイルの場合> hBmp = LoadImage(0, "image.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE)
If 0 = hBmp then MessageBox(0, "ビットマップのロードに失敗.", 0, MB_OK): return
'===== ビットマップ情報の取得
GetObject(hBmp, SizeOf(BITMAP), BmpInfo)
End Sub
Sub MainWnd_Paint(hDC As HDC)
'ビットマップがロードされていない場合は処理しない
If 0 = hBmp then return
/* 再描画命令以外から処理する場合はコメントアウトを外す
Dim hDC As HDC
'===== ウィンドウのDCを取得
hDC = GetDC(hMainWnd)
*/
Dim hMemDC As HDC
Dim hOldBmp As HANDLE
'===== メモリDCにビットマップを選択
'メモリDCを作成
hMemDC = CreateCompatibleDC(hDC)
If 0 = hMemDC then return
'ビットマップを選択
hOldBmp = SelectObject(hMemDC, hBmp)
'===== 描画
'メモリDCからウィンドウのDCにコピー
BitBlt(hDC, 0, 0, BmpInfo.bmWidth, BmpInfo.bmHeight, hMemDC, 0, 0, SRCCOPY)
'===== 後処理
'ビットマップの選択を解除
SelectObject(hMemDC, hOldBmp)
'メモリDCの破棄
DeleteDC(hMemDC)
/* 再描画命令以外から処理する場合はコメントアウトを外す
'===== ウィンドウのDCを解放
ReleaseDC(hDC)
*/
End Sub
たぶん今回のケースは「その他の箇所で書く場合」で解決すると思います。HOLY さんが書きました:本には、
CreateCompatibleDC(hDC)
っと書いてあったので、まねしてみたら
『hDC』は無効な識別です
っとエラーが出てきます。
変数などの定義はなかったと思います。
もしあればそこは指摘してくださいです。