いつも参考にさせて頂いています。
環境は、
Visual Studio 2005 で MFCを使ってダイアログベースのアプリを開発しています。
ダイアログの背景に画像を使用したく、OnPaintメソッド内で背景に画像を設定していま
すが、それだけだと画面を動かした時にダイアログに配置されたボタンやタブなどのコン
トロールが消えてしまいます。
そこで、
//背景画像描画
CDC* pDC = this->GetDC();
CDC myDC;
CBitmap myBMP;
myBMP.LoadBitmapW(IDB_BITMAP1);
myDC.CreateCompatibleDC(pDC);
CBitmap* oldBMP = myDC.SelectObject(&myBMP);
pDC->BitBlt(0,0,1000,1000, &myDC, 0, 0, SRCCOPY);
と、背景を描画した後に、
GetDlgItem(IDC_BUTTON1)->RedrawWindow();
と、コントロールを再描画しているのですが、画面がちらつきます。
具体的には、背景描画とコントロール描画の間のコントロールがない状態がチラチラ見え
るという状態です。
背景描画とコントロールの描画まで終わってから、一気に画面に転送する方法はないでし
ょうか?
または、方法が全然違う!とかありましたら、アドバイスを下さい。
どうぞ宜しくお願いします。
クラスウィザードから
メッセージフィルタをダイアログからウィンドウに変更し、
WM_ERASEBKGNGから背景を書く。邪道かもしれませんが自分は
いつもそうしています。
t.n.さん、返信ありがとうございます。
「クラスウィザードからメッセージフィルタをダイアログからウィンドウに変更し」とい
う部分が分からなかったのですが、WM_ERASEBKGNGを実装してみました。
WM_ERASEBKGNGの処理の中で、最初に書き込んだ内容と同じこと(背景を描画→各種コン
トロールを再描画)の順で実装しました。
結果は、まだチラつきます。
もう少し詳しく書きますと、
ダイアログのサイズは1000×700くらいの大きさです。
そこにビットマップの背景を貼り付けています。
ダイアログを移動した時に、一部が画面の外に出てしまったり、その状態から画面内に戻
したりすると、背景全体が再描画されます。その時に一瞬コントロールが消えたようにな
り、チラついています。
どうぞ、宜しくお願いします。
>WM_ERASEBKGNGの処理の中で、最初に書き込んだ内容と同じこと(背景を描
画→各種コントロールを再描画)の順で実装しました。
WM_ERASEBKGNGは背景の面倒だけ見るべきで
各種コントロールの再描画をするのは変じゃないかな
とーりすがりさん、コメントありがとうございます。
コントロールを再描画しないと、コントロールが背景画像の下になって見えなくなってし
まいます。
背景画像とはいっても、プログラムとしては背景画像として扱っている様子はありませ
ん。
そもそもMFCのダイアログに背景画像を設定することはできるのでしょうか?
Visual Studio 2005のダイアログのプロパティにはそれらしき項目は見当たりません。
http://homepage1.nifty.com/coffee-break/pc/pc4/mfc4_0207p.html
このリンク先のようなダイアログを作成したいだけなのですが・・・。
>WM_ERASEBKGNGの処理の中で、最初に書き込んだ内容と同じこと(背景を描画→各種コ
ン
>トロールを再描画)の順で実装しました。
とーりすがりさんがおっしゃっていますが、
ここで背景処理のみ実行します。
OnPaintで背景上書きしたらダメです。
また、普通コントロールのRedrawを描画関数の中でしません。
コントロールがReDrawした場合親のOnPaintやらOnEraseBkgndなどの
関数が呼ばれる場合があります。
ヘルプに書いてありませんか?(未確認)
t.n.さん、とーりすがりさん、アドバイスありがとうございました。
問題が解決しました。
ダイアログのプロパティに「Clip Childre」という項目があり、それをTrueにすること
で、背景を再描画してもコントロールが消えなくなりました。
そのため、コントロールを再描画する必要がなくなり、チラつきが発生しなくなりまし
た。
どうもありがとうございました。
解決のチェックを忘れました。