フレームウィンドウの初期の色 – プログラミング – Home

フレームウィンドウの初期の色
 
通知
すべてクリア

[解決済] フレームウィンドウの初期の色


いしだ
 いしだ
(@いしだ)
ゲスト
結合: 17年前
投稿: 53
Topic starter  

Visual Studio 2008や2010のMFCで、
SDI形式のプロジェクトをデフォルトのまま作成
(高度なフレームペインはすべてオフ)

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

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

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

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

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


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

手元に 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 で塗りつぶ
すというものになっているわけです。


返信引用
いしだ
 いしだ
(@いしだ)
ゲスト
結合: 17年前
投稿: 53
Topic starter  

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました