- ベストアンサー
WM_PAINTとBitBltについての質問
- 質問者はWindowsプログラミングを1月半ほど始めた初心者であり、WM_PAINTとBitBltに関する疑問があります。
- 質問者は副スレッドを使用して図形を動かすプログラムを作成しましたが、画面がちらつく問題が発生しています。
- 質問者はWM_PAINTの再描画による画面のちらつきの原因やBitBltの使用によるちらつきの回避方法について知りたいとしています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス >1)WM_PAINTで画面の再描画を行うと画面が何故チラつくのですか? ↑ チラツキの原因 (1)WM_ERASEBKGNDメッセージで背景を描画(塗りつぶし) (2)WM_PAINTで前景(図形など)を描画(ここでちらつく) チラツキの対策 (1)メモリDCを1つ用意 (2)用意したメモリDCに背景部分を描画 (3)用意したメモリDCに前景部分を描画←図形や文字など (4)InvalidateRect()を実行 (5)WM_PAINT内で用意したメモリDCを画面のDCへBitBltでコピー(上書き) (6)これでちらつかずに描画が可能 >2)BitBltを用いるとチラつかないのは何故でしょうか? ↑ WM_ERASEBKGNDメッセージで背景が塗りつぶされるためちらつきます。瞬間だけ。 だからWM_ERASEBKGNDメッセージを処理して下さい。 処理といっても単純に『return 0;』を返すだけで良い。 つまりプロシージャで『case WM_ERASEBKGND:return 0;』とする。 3)参考までにですが、メモリDCでBitBltで転送、以外に画面をチラつかせずに画面を更新させる方法はあるでしょうか? ↑ 過去に私の回答を参考にして下さい。 http://oshiete1.goo.ne.jp/qa3052870.html→『画面がチカチカする』 回答No.3に『CASE WM_ERASEBKGND:return 0;』の1行を追加して試して見て下さい。 なお、メモリDCはWM_CREATEで作成してスレッドにそのメモリDCのハンドルを 引数として渡せば良いでしょう。またはグローバルな変数にしても動きます。
その他の回答 (1)
- shred
- ベストアンサー率35% (25/70)
Windowsはあまり使わないのでよく知りませんが ちらつきの原因としてはWM_PAINTがくると画面を塗りつぶした上で 描画が行われるのでチカチカするのだと思います。 BitBltではそれを回避することができるのだと思います。
お礼
回答有難う御座います。 お陰様で解決いたしました。
お礼
回答有難う御座います。 正直なところ、デバイスコンテキストの概念さえも良く分からない状態だったので大分時間がかかってしまいましたが、頂いたアドバイスとソースコードのお陰で、やっとちらつきを止めることが出来ました。 どうも有難う御座いました。