by のぶあや » 2008年3月15日(土) 23:08
全体的な流れなら以下のようになります。
IDEの再描画命令で書く場合
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします] [1] 引数のhDCからCreateCompatibleDC関数を呼び出してメモリDCを作成
[2] 作成したメモリDCにロードしてあるビットマップを選択させる
[3] メモリDCからウィンドウのDC(hDC)にコピー(BitBlt)
[4] メモリDCに設定したビットマップを解除([2]の戻り値を選択させる)
[5] メモリ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』は無効な識別です
っとエラーが出てきます。
変数などの定義はなかったと思います。
もしあればそこは指摘してくださいです。
たぶん今回のケースは「その他の箇所で書く場合」で解決すると思います。
全体的な流れなら以下のようになります。
IDEの再描画命令で書く場合
[hide] [1] 引数のhDCからCreateCompatibleDC関数を呼び出してメモリDCを作成
[2] 作成したメモリDCにロードしてあるビットマップを選択させる
[3] メモリDCからウィンドウのDC(hDC)にコピー(BitBlt)
[4] メモリDCに設定したビットマップを解除([2]の戻り値を選択させる)
[5] メモリDCを破棄[/hide]
その他の箇所で書く場合
[hide] [0] ウィンドウのDCを取得
[1]~[5] 上記と同じ処理
[6] ウィンドウのDCを解放[/hide]
ソースはこんな感じになります。
[hide][code]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
[/code][/hide]
[quote="HOLY"]本には、
CreateCompatibleDC(hDC)
っと書いてあったので、まねしてみたら
『hDC』は無効な識別です
っとエラーが出てきます。
変数などの定義はなかったと思います。
もしあればそこは指摘してくださいです。[/quote]
たぶん今回のケースは「その他の箇所で書く場合」で解決すると思います。