フレームウィンドウの初期の色

[戻る]
いしだ 2014/07/26(土) 11:26:52
Visual Studio 2008や2010のMFCで、
SDI形式のプロジェクトをデフォルトのまま作成
(高度なフレームペインはすべてオフ)

アプリケーションクラスのInitInstance()にある
m_pMainWnd->UpdateWindow();
の行にブレークポイントを置いて実行

とやると、フレームウィンドウが表示された状態でブレークがかかりますが、
この時点ではウィンドウ全体が白になっています。
F10を押してUpdateWindow()を実行すると、
メニューやツールバーの部分が描画されます。

試しに、CMainFrameとビューのクラスにOnPaint()を用意し、
GetClientRect()の領域全体を別の色で塗りつぶしてみましたが、
上記のブレークポイントの位置では白いままでした。

この白の色は、どこで誰が描画しているのでしょうか。
任意の色に変更しておくことは可能なのでしょうか。

コントロールパネルのウィンドウの色とデザインで
「ウィンドウ」の色を変えてみても、白いままでした。

aetos 2014/07/29(火) 17:58:43
手元に VS2013 しかないので、同じコードになるかどうかわかりませんが…

ウィンドウの既定の背景色は、ウィンドウクラスの hbrBackground メンバーで指定でき
ます。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633577.aspx

MFC でやる場合は、CMainFrame::PreCreateWindow でカスタマイズできます。
AfxRegisterWndClass がウィンドウクラスを登録する処理です。
http://msdn.microsoft.com/ja-jp/library/cw5335z0.aspx

この第3引数が、WNDCLASSEX:hbrBackground にセットされますので、この値を変えてやる
ことで、フレームの既定の背景色を変更することができます。

例えば、こんな風に。
cs.lpszClass = AfxRegisterWndClass(0, NULL, reinterpret_cast<HBRUSH>(COLOR_HIGHL
IGHT + 1));

これはフレームウィンドウの背景色なので、実際には、すぐに View が被せられて見えな
くなってしまいます。
View の既定の背景色も、同様に PreCreateWindow で変更することができます。

また、単色で塗りつぶすのではなく、任意の描画を行いたい場合は、OnEraseBkGnd をオ
ーバーライドして行うことができます。
http://msdn.microsoft.com/ja-jp/library/a0a52fkz.aspx

OnEraseBkGnd のオーバーライドしない場合の既定の処理が、hbrBackground で塗りつぶ
すというものになっているわけです。

いしだ 2014/07/30(水) 09:26:50
[[解決]]
> OnEraseBkGnd のオーバーライドしない場合の既定の処理が、hbrBackground で塗りつぶ
> すというものになっているわけです。

AfxRegisterWndClass()やOnEraseBkgnd()が関わっていたのですね。
原理を理解することができました。
ありがとうございます。

古いスレッドには追加発言できません。