アプリ版:「スタンプのみでお礼する」機能のリリースについて

MFCです。

ワーカースレッドで取得したDIBを定期的に描画するプログラムを作っています。
DIB描画部の下にはタイトル的な文字列をTextOutしています。
リサイズ時にはDIBのサイズとタイトル文字列表示領域のサイズも変化させる必要があります。

現在、画面をリサイズするとちらつくという問題の対応に悩んでいます。
コンパチDCなどを使ってダブルバッファリングを行うというのはわかっているのですが、
そもそもリサイズ時にちらつくということは、背景が白(デフォルトのブラシ)で塗りつぶされてしまうのが原因だと思っているので、
OnEraseBkgnd()をオーバーライドして、return TRUE するようにしました。

ちらつかなくなったのですが、OnEraseBkgnd()でほかに何もしていないので、リサイズ前のDIBとタイトル文字列が残ってしまって、新たに書き込んだものと重なってしまいます。

OnEraseBkgnd()で背景をいったん塗りつぶせばいいのではないかと思っているのですが、私の考えは正しいでしょうか?

A 回答 (2件)

つまり


WS_EX_COMPOSITED
が使えない理由がある、ということでしょうか?

そういう前提だとすると

・MFCのラッピングを使用し自分ではコーディングしない
・ソースコードが会社にあるので詳しく書くのは難しい

となると、ちょっとお手上げです。

描画処理についても、ダブルバッファリングなので概要はそういう風になると思うのですが、正確なコード(と、もっと言うと会社側の提示してい
る制限、目的とする環境など)が分からないと、なんとも言えません。


それでも推考してみると


OnEraseBkgnd()でreturn TRUEとかInvalidateRect(FALSE)とか試していらっしゃるようなので
(他にはウインドウクラス登録時にバックグラウンドをNULLにしたり、ウインドウクラスのスタイルからCS_HREDRAWやCS_VREDRAWを外してやるとかも色々考えられますが)

>新たに書き込んだものと重なってしまいます

という記述を見る限りそこはちゃんと対処出来てると思うのですが


ダブルバッファが「本当にうまくいって」いますか?
概ね大丈夫ではないかと思うのですが、Vistaではどうなのか、というとVistaの抱える問題のごく一部しか私は把握していませんので、厳密に言うと完全には分かりません、が

普通に考えると「実際に『描画する側』のバッファ(表示されない裏画面)そのものに対して『背景を
塗りつぶしたうえに文字を書いて』やり」それを実際に見える方へコピーする、という方式にすれば
妥当に考えてOKと思います。

現状そういう風になっていますか?
    • good
    • 0
この回答へのお礼

先に背景を塗りつぶしてその上に書きたいものを書くようにしたら、実現できました!
ありがとうございました。

お礼日時:2010/03/17 22:57

いざという時の拡張ウインドウスタイル


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に書き込む。

と、こんな感じです。

よく考えると、自分で背景を塗りつぶしてしまったら、システムが塗りつぶす色が違うだけで、塗りつぶし→描画の繰り返しで、結局ちらついてしまうような気がします。

補足日時:2010/03/16 23:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!