レベルは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で転送、以外に画面をチラつかせずに画面を更新させる方法はあるでしょうか?
色々サイトを探してみてのですが、断片的にしか書いておらず、結局自分が所望する回答は得られませんでした。
初心者レベルなので、分かりやすく説明して頂けると大変嬉しいです。
以上、宜しくお願い致します。
No.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のハンドルを
引数として渡せば良いでしょう。またはグローバルな変数にしても動きます。
参考URL:http://oshiete1.goo.ne.jp/qa3052870.html
回答有難う御座います。
正直なところ、デバイスコンテキストの概念さえも良く分からない状態だったので大分時間がかかってしまいましたが、頂いたアドバイスとソースコードのお陰で、やっとちらつきを止めることが出来ました。
どうも有難う御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
準・究極の選択
「年収1000万円で一生カレーライス」か 「年収180万円で毎日何でも食べ放題」 あなたはどちらを選びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
画面がチカチカする
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
word
-
VB6,リストボックスの特定行の...
-
ビットマップを表示させる(MFC)
-
移動する線を描画したい(何と...
-
NVIDIAのシェーダーキャッシュ
-
C++, MFCにてゲームプログラミング
-
VBAにGDI+を参照させる方法
-
TextBoxに文字を書いても表示さ...
-
逐次的なグラフ表示の方法
-
[VB.net] DataGridViewの列ヘッ...
-
OnDrawが呼び出されません
-
クライアント領域のコントロー...
-
Labelの文字をスクロールする際...
-
ウインドウサイズを変更しても...
-
UpdateData( FALSE); による文...
-
VB.netでのライン描画方法がわ...
-
Delphiでキューを作りたい
-
MFCでOnPaintのタイミング
-
CScrollViewの使用方法について
-
panelのスクロール表示について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
word
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
Minecraft 統合版(PC)の描画距...
-
google Colabでmatplotlibの描...
-
TextBoxに文字を書いても表示さ...
-
[VB.net] DataGridViewの列ヘッ...
-
UpdateData( FALSE); による文...
-
OneNote 2010 文字と描画がずれる
-
Labelの文字をスクロールする際...
-
InvalidateRectの使い方について
-
VB.netでのライン描画方法がわ...
-
CStaticコントロールの静的イメ...
-
VC++プログラムをつかったBMP画...
-
WM_SIZEとWM_SIZINGの違い (Win...
-
エクセルでガンチャートを作成...
-
c言語を使いダイアログにbmpを...
-
WM_PAINT
-
MFCのタイマーのつかい方を教え...
おすすめ情報