050105 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

C7

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X
2006.04.10
XML
カテゴリ:プログラミング。
ウィンドウに色々と描写して遊んでいてウィンドウのチラつきが気になったので回避策を探しました。

まず、コールバック関数で 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) | コメントを書く
[プログラミング。] カテゴリの最新記事


PR

Profile

CSeven's

CSeven's

Category

Favorite Blog

そうじゃないかもね nekoko0207さん
ICHICO ICHICO*さん
ロミオとロミオは永… 黒い椅子さん
モノクローム。 ファッキン洋平。さん

Comments

ミロロ@ 白 濁 液 通っているんだなwwwwwww アレはもう飽きたし疲れるから結局こっち…
斉藤さん@ 生・・・・・・wwwww <small> <a href="http://kuma.chala-he…
はなお@ これなんて魔法?www 昨日会った女の子、「舐 めまくりたい!…

© Rakuten Group, Inc.
X