MFCです。
ワーカースレッドで取得したDIBを定期的に描画するプログラムを作っています。
DIB描画部の下にはタイトル的な文字列をTextOutしています。
リサイズ時にはDIBのサイズとタイトル文字列表示領域のサイズも変化させる必要があります。
現在、画面をリサイズするとちらつくという問題の対応に悩んでいます。
コンパチDCなどを使ってダブルバッファリングを行うというのはわかっているのですが、
そもそもリサイズ時にちらつくということは、背景が白(デフォルトのブラシ)で塗りつぶされてしまうのが原因だと思っているので、
OnEraseBkgnd()をオーバーライドして、return TRUE するようにしました。
ちらつかなくなったのですが、OnEraseBkgnd()でほかに何もしていないので、リサイズ前のDIBとタイトル文字列が残ってしまって、新たに書き込んだものと重なってしまいます。
OnEraseBkgnd()で背景をいったん塗りつぶせばいいのではないかと思っているのですが、私の考えは正しいでしょうか?
No.2ベストアンサー
- 回答日時:
つまり
WS_EX_COMPOSITED
が使えない理由がある、ということでしょうか?
そういう前提だとすると
・MFCのラッピングを使用し自分ではコーディングしない
・ソースコードが会社にあるので詳しく書くのは難しい
となると、ちょっとお手上げです。
描画処理についても、ダブルバッファリングなので概要はそういう風になると思うのですが、正確なコード(と、もっと言うと会社側の提示してい
る制限、目的とする環境など)が分からないと、なんとも言えません。
それでも推考してみると
OnEraseBkgnd()でreturn TRUEとかInvalidateRect(FALSE)とか試していらっしゃるようなので
(他にはウインドウクラス登録時にバックグラウンドをNULLにしたり、ウインドウクラスのスタイルからCS_HREDRAWやCS_VREDRAWを外してやるとかも色々考えられますが)
>新たに書き込んだものと重なってしまいます
という記述を見る限りそこはちゃんと対処出来てると思うのですが
ダブルバッファが「本当にうまくいって」いますか?
概ね大丈夫ではないかと思うのですが、Vistaではどうなのか、というとVistaの抱える問題のごく一部しか私は把握していませんので、厳密に言うと完全には分かりません、が
普通に考えると「実際に『描画する側』のバッファ(表示されない裏画面)そのものに対して『背景を
塗りつぶしたうえに文字を書いて』やり」それを実際に見える方へコピーする、という方式にすれば
妥当に考えてOKと思います。
現状そういう風になっていますか?
No.1
- 回答日時:
いざという時の拡張ウインドウスタイル
WS_EX_COMPOSITED
ではダメですか?
ただいざというとき、なので
状況によっては使ってはダメな場合があるので
ちょうど興味がありますから、それの使用が無理でしたら
よろしければOSと
サイズ変更時(WM_SIZE)の処理、描画処理、ウインドウ生成、ウインドウクラス登録のあたりのコードを教えてください。
この回答への補足
早速の回答、ありがとうございます。
>よろしければOSと
>サイズ変更時(WM_SIZE)の処理、描画処理、ウインドウ生成、ウインドウクラス登録のあたりのコードを教えてください。
OSはVistaです。
MFCのDocument-Viewの仕組みを使っていまして、ウィンドウ生成、ウィンドウクラス登録はMFCでラッピングされています(自分ではコーディングしない)が、
ソースコードが会社にありますので、詳しく書くのは難しいです^^;
文章にしますと、
・WM_SIZE(OnSize)の処理
InvalidateRect(FALSE)でクライアント領域の無効化とステータスバーの内容更新だけです。
・描画処理
1.DIBをいったんメモリDCへ書き込んだ後、実際の画面用のDCに書き込む。
2.タイトルも1.と同様にいったんメモリDCへ書き込んだ後、実際の画面用のDCに書き込む。
と、こんな感じです。
よく考えると、自分で背景を塗りつぶしてしまったら、システムが塗りつぶす色が違うだけで、塗りつぶし→描画の繰り返しで、結局ちらついてしまうような気がします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- フリーソフト 倍率自動調整して全画面表示できるフリーの画像ビューアー 1 2023/08/24 10:55
- その他(パソコン・スマホ・電化製品) リサイズ超簡単!Pro のインストールについて 1 2022/06/16 16:20
- Windows 8 動画の再生とタイトルの変更方法を教えてください。 3 2022/08/01 14:51
- Illustrator(イラストレーター) ペイントでサイズを小さくする 5 2023/06/17 10:33
- 美術・アート 【Photoshop】設定したサイズが正しく反映されない事象の解決方法 1 2022/08/31 22:53
- WordPress(ワードプレス) WordpressでYouTubeの埋め込みができない。 1 2022/10/26 01:08
- レトロゲーム ファミコンのインベーダの質問その3 背景にインベーダーを描画したとしても、なぜ動けるのか? 3 2022/07/08 16:58
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- Illustrator(イラストレーター) ワードに貼った画像のキャンバスと画像本体のサイズの調整 2 2022/05/19 18:31
- その他(学校・勉強) 絵の描くのが下手な人、字を書くのが下手な人は記憶力が悪い? 7 2022/07/18 07:32
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel 2019 [オプション]の[リボンのユ...
-
pset関数について
-
TextBoxに文字を書いても表示さ...
-
UpdateData( FALSE); による文...
-
VB6,リストボックスの特定行の...
-
StretchBlt関数について
-
CDC(LineTo)で描画した線を透過...
-
CStaticコントロールの静的イメ...
-
C# Graphics.DrawLine();で行う...
-
Minecraft 統合版(PC)の描画距...
-
DXライブラリについて(ゲーム...
-
ボタン形のラベル
-
透視投影図形の回転
-
円の描画の太さを指定できるCコ...
-
vb.netでテキストボックス内の...
-
アプリケーションのデザイン
-
OneNote 2010 文字と描画がずれる
-
[VB.net] DataGridViewの列ヘッ...
-
タブをオーナードローすると、...
-
word
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MFCでOnPaintのタイミング
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
NVIDIAのシェーダーキャッシュ
-
TextBoxに文字を書いても表示さ...
-
UpdateData( FALSE); による文...
-
VB6,リストボックスの特定行の...
-
PCで「使用可能な場合はグラフ...
-
VC++プログラムをつかったBMP画...
-
VBAにGDI+を参照させる方法
-
FlexGridの一部のみ表示を更新...
-
pset関数について
-
エクセルでガンチャートを作成...
-
Form1 Load で実行されない。
-
C言語(dxlib)のDrawboxについ...
-
MFCのタイマーのつかい方を教え...
-
InvalidateRectの使い方について
-
CStaticコントロールの静的イメ...
-
Windowのちらつき防止
-
GDI+で高速な描画
おすすめ情報