質問: wm_paintとbitblt レベルはwindowsプログラミングを始めて1月半、それ以前にプログラミング経験はありません。 環境は、vc++6.0 windowsxp sp2です。 winapiしか使えません(mfcは分かりません)。 宜しくお願い致します。 定期的に図形を動かすプログラムを副スレッドを用いて作りました。 副スレッドにはsleep(5msスリープ)を入れてあり、スレッドの最後にinvalidaterectを実行し、wm_paintを発行して再描画させているのですが、動作は所望な通りなものの、画面がちらついてしまいます。 所持している参考書を読むと、図形を動かす処理を直接ディスプレイに出すのではなく、メモリdcに一度出力し、その後bitbltでディスプレイに出力すればよい(ダブルバッファのことらしい?)、と書いてありました。 また、あるサイトには、wm_paintが実行されるとonerasebkgndが走るからちらつくとも書いてあり、何だか良く分かりません。 (別のサイトにはonpaintが走るとか、onpaintbackgroundが走ると書いてあり、何が本当なのか???) 自分の知りたいことは以下の通りです。 1)wm_paintで画面の再描画を行うと画面が何故チラつくのですか? また、ちらつかない様にする方法はあるのでしょうか? 2)bitbltを用いるとチラつかないのは何故でしょうか? 3)参考までにですが、メモリdcでbitbltで転送、以外に画面をチラつかせずに画面を更新させる方法はあるでしょうか? 色々サイトを探してみてのですが、断片的にしか書いておらず、結局自分が所望する回答は得られませんでした。 初心者レベルなので、分かりやすく説明して頂けると大変嬉しいです。 以上、宜しくお願い致します。
回答: ★アドバイス >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のハンドルを 引数として渡せば良いでしょう。またはグローバルな変数にしても動きます。