Visual Studio 2008や2010のMFCで、
SDI形式のプロジェクトをデフォルトのまま作成
(高度なフレームペインはすべてオフ)
アプリケーションクラスのInitInstance()にある
m_pMainWnd->UpdateWindow();
の行にブレークポイントを置いて実行
とやると、フレームウィンドウが表示された状態でブレークがかかりますが、
この時点ではウィンドウ全体が白になっています。
F10を押してUpdateWindow()を実行すると、
メニューやツールバーの部分が描画されます。
試しに、CMainFrameとビューのクラスにOnPaint()を用意し、
GetClientRect()の領域全体を別の色で塗りつぶしてみましたが、
上記のブレークポイントの位置では白いままでした。
この白の色は、どこで誰が描画しているのでしょうか。
任意の色に変更しておくことは可能なのでしょうか。
コントロールパネルのウィンドウの色とデザインで
「ウィンドウ」の色を変えてみても、白いままでした。
手元に 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 で塗りつぶ
すというものになっているわけです。
> OnEraseBkGnd のオーバーライドしない場合の既定の処理が、hbrBackground で塗りつぶ
> すというものになっているわけです。
AfxRegisterWndClass()やOnEraseBkgnd()が関わっていたのですね。
原理を理解することができました。
ありがとうございます。