カテゴリ:プログラミング。
ウィンドウに色々と描写して遊んでいてウィンドウのチラつきが気になったので回避策を探しました。
まず、コールバック関数で WM_ERASEBKGND を捕まえたら TRUE を返して抜けるようにします。 こうするとウィンドウの背景が勝手に消去されるなんてことを回避できます。 ウィンドウに自分でちゃんと描写しているならこの時点ですでにチラつきが少なくなるんですけど、まだ少しチラつきます。 ということでダブルバッファリングを使うことにしました。 ダブルバッファリングは、目に見える画面と目に見えない画面とがあって、絵を実際に書くのは目に見えない画面で、絵を描き終わったら目に見える画面にコピーしてやることです。 コールバック関数で WM_PAINT を捕まえて描写します。 ActiveBasicのRADツールを使っている為、hDCの宣言などは抜けてます。 Dim hMemDC As HDC Dim hBmp As HBITMAP Dim hOldBmp As HBITMAP Dim rc As RECT Dim bStr[256] As Byte 'ウィンドウの左上隅、右下隅の座標をスクリーン座標で取得。 GetWindowRect(hMainWnd,rc) 'デバイスコンテキストにコンパチブルなメモリデバイスコンテキストを作成。 hMemDC=CreateCompatibleDC(hDC) 'デバイスコンテキストにコンパチブルなビットマップを作成。 'サイズはウィンドウに合わせる。 hBmp=CreateCompatibleBitmap(hDC, rc.right-rc.left,rc.bottom-rc.top) 'メモリデバイスコンテキストにビットマップを選択。 hOldBmp=SelectObject(hMemDC,hBmp) 'メモリデバイスコンテキストの背景を黒で塗り潰す。 FillRect(hMemDC,rc,GetStockObject(BLACK_BRUSH)) lstrcpy(bStr,"文字列を描写します。") 'メモリデバイスコンテキストに文字列を描写。 TextOut(hMemDC,100,100,bStr,lstrlen(bStr)) 'デバイスコンテキストにメモリデバイスコンテキストを描写。 '不可視画面に描かれた絵を可視画面に写している。 BitBlt(hDC, 0,0, rc.right-rc.left,rc.bottom-rc.top, hMemDC, 0,0, SRCCOPY) 'お絵かきする為の道具はちゃんと片付ける。 SelectObject(hMemDC,hOldBmp) DeleteObject(hBmp) DeleteDC(hMemDC) 一応自分の環境では見事にチラつくことがなくなりました。万歳。 お気に入りの記事を「いいね!」で応援しよう
Last updated
2006.04.10 23:29:54
コメント(0) | コメントを書く |
|