最近BMPの扱い方を覚えてきたので、仮想画面作りに挑戦してます。
これを覚えれば再描画処理が楽になるはず!。
が、やっぱりGDIまわりは難しいです・・・。
さて。
メモリデバイスコンテキスト(hMemDC)と、それに付随するビットマップ(hBmp)を
グローバルで作っておいて、TextOut()、LineTo()などで文字/模様を描画するたびに
デバイスコンテキストをメモリデバイスコンテキストにコピーし、
WM_PAINTではひたすらメモリデバイスコンテキストから
デバイスコンテキストに画像貼り付けをするのみ、
とすれば再描画を気にせずに済むかと思ったのですが・・・上手くいかないです。
以下、ソースです。
ボタンが押されると「hoge」と文字を書き出します。
無効リージョンが発生したときに、それを再描画したいのですが・・・。
コード: 全て選択
Dim hMemDC As DWord
Dim hBmp As DWord
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
'メモリデバイスコンテキストのテスト
Dim hDC As DWord
Dim lpRect As RECT
hDC = GetDC( hMainWnd )
hMemDC = CreateCompatibleDC( hDC )
GetClientRect( hMainWnd, lpRect )
hBmp = CreateCompatibleBitmap( hDC, lpRect.right, lpRect.bottom )
SelectObject( hMemDC, hBmp )
BitBlt( hMemDC, 0, 0, lpRect.right, lpRect.bottom, hDC, lpRect.right, lpRect.bottom, SRCCOPY )
ReleaseDC( hMainWnd, hDC )
End Sub
Sub MainWnd_Destroy()
'メモリデバイスコンテキストの破棄
DeleteDC( hMemDC )
DeleteObject( hBmp )
TestWnd_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_CommandButton2_Click()
Dim hDC As DWord
Dim lpRect As RECT
Dim strBuf As String
'文字を書き出す。
strBuf = "hoge"
hDC = GetDC( hMainWnd )
TextOut( hDC, 32, 32, strBuf, Len(strBuf) )
'BMPへコピー→メモリデバイスコンテキストへ選択。
GetClientRect( hMainWnd, lpRect )
hBmp = CreateCompatibleBitmap( hDC, lpRect.right, lpRect.bottom )
DeleteObject( SelectObject( hMemDC, hBmp ) )
BitBlt( hMemDC, 0, 0, lpRect.right, lpRect.bottom, hDC, lpRect.right, lpRect.bottom, SRCCOPY )'意味無いのかな?
ReleaseDC( hMainWnd, hDC )
End Sub
Sub MainWnd_Paint(hDC As DWord)
Dim lpPaint As PAINTSTRUCT
Dim lpRect As RECT
GetClientRect( hMainWnd, lpRect )
hDC = BeginPaint( hMainWnd, lpPaint )
'メモリデバイス~から貼り付ける。
BitBlt( hDC, 0, 0, lpRect.right, lpRect.bottom, hMemDC, lpRect.right, lpRect.bottom, SRCCOPY )
EndPaint( hMainWnd, lpPaint )
End Sub
1) 方向性はこれであっているのか? あっているならばどこが悪いのか。
2) それとも根本的にデバイスコンテキストの理解が間違っているのか。
以上です。
よろしくお願いします。