ウインドウ再描画のもう一つは、メモリー内に
GDIビットマップを保持するヴぃでおめもり領域を確保し、ペイントいべんとでバッファヴいでおめもりを描画。
描画はバッファヴぃでおめもりに対して行う。
MainWnd.sbp
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
'バックバッファデバイスコンテキストをつくる
Dim vbuff As HDC
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
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()
'バファDCを開放
DeleteDC(vbuff)
testgdi3_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim bm As HBITMAP
Dim dc1 As HDC
dc1=GetDC(hMainWnd)
'バックバファを作る
vbuff=CreateCompatibleDC(dc1) 'DIB
bm=CreateCompatibleBitmap(dc1,500,500) 'DDB
SelectObject(vbuff,bm) '紐付け
'バファ領域を白で初期化
PatBlt(vbuff,0,0,500,500,WHITENESS)
End Sub
Sub MainWnd_Paint(hDC As HDC)
'再描画時にバックバファを描画
BitBlt(hDC,0,0,100,100,vbuff,0,0,SRCCOPY)
End Sub
Sub MainWnd_CommandButton1_Click()
Dim p As POINTAPI
Dim dc1 As HDC
dc1=GetDC(hMainWnd)
'バックバファに描画
MoveToEx(vbuff,0,50,p)
LineTo(vbuff,100,100)
'再描画
BitBlt(dc1,0,0,100,100,vbuff,0,0,SRCCOPY)
End Sub
通常、ウインドウズのウインドウ描画はイベントが発生した場合にウインドウ外枠を描画するが、
ウインドウ領域(クライアント領域)内については特別に
メモリを割り当ててビットマップ情報を管理してない。
これは
ユーザー側の仕事。
クライアントウインドウ内をビットマップとして描画する際には、ウインドウが作成されたタイミングで、
ビデオメモリのような領域をデバイスコンテキストとして作成し、ユーザーはこの
デバイスコンテキスト(ビデオメモリ)に対して
Line文を使う。
あとはウインドウの再描画のメッセージで、このビデオメモリに相当するデバイス
コンテキストのバックバッファを画面に再描画(PAINTイベントでbitblt)すれば良い。
これで、一連のウインドウ操作で一旦書いた線が消えることはない。
使ったデバイスコンテキストは
プログラムが終了する時点で開放する。
タイマーを使ってバックバッファから再描画させれば、一定間隔で画面を更新することが出来る。
最終更新:2010年10月23日 14:32