バックグラウンドカラーとウィンドウプロシージャ
前回は、ウィンドウクラスで登録するカーソルを変更することで、ウィンドウ内で表示されるマウスカーソルを変更するサンプルと取り上げた。今回は、背景カラーで同じことをやってみよう。ウィンドウクラスを設定する次の部分だ。
ウィンドウクラスを設定している部分
// ウィンドウクラス構造体を用意
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = CLASS_NAME;
前回まではwc.hbrBackgroundに「(HBRUSH) (COLOR_WINDOW + 1)」を代入していたが、今回はNULLを代入している。
「wc.lpfnWndProc = WindowProc;」という部分を見るとわかるが、このウィンドウクラスではウィンドウプロシージャとしてWindowProc()関数を登録している。そして、WindowProc()関数は次のようなものを用意してある。
用意したWindowProc()関数
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, BACKGROUND_COLOR);
EndPaint(hwnd, &ps);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
ウィンドウに対して何らかのアクションの必要性が発生すると(例えば、「リサイズなどによってウィンドウを再描画する」「ウィンドウを破棄する」など)、ウィンドウクラスに登録されているウィンドウプロシージャ(関数)が呼び出される。用意したこの関数において、「FillRect(hdc, &ps.rcPaint, BACKGROUND_COLOR);」のように背景カラーを塗っている。ここで色が塗られるので、ウィンドウクラスでデフォルトの背景カラーを設定しておいてもあまり意味がなかったのだ。
これは、ウィンドウプロシージャが機能していることを調べる方法としても利用できる。今回はこの部分を書き換えて動きを調べてみよう。
バックグラウンドカラーを書き換える
デフォルトの状態だと、次のようにCOLOR_WINDOWというデフォルトカラーが背景色に指定されている。
背景色: COLOR_WINDOW
#define BACKGROUND_COLOR (HBRUSH) (COLOR_WINDOW + 1)
ビルドして実行すると、次のようになる。
では、この部分の色指定を変えながらビルドして実行してみよう。実行すると次のようになる。
背景色: COLOR_ACTIVECAPTION
#define BACKGROUND_COLOR (HBRUSH) (COLOR_ACTIVECAPTION + 1)
背景色: COLOR_APPWORKSPACE
#define BACKGROUND_COLOR (HBRUSH) (COLOR_APPWORKSPACE + 1)
背景色: COLOR_BTNTEXT
#define BACKGROUND_COLOR (HBRUSH) (COLOR_BTNTEXT + 1)
背景色: COLOR_GRAYTEXT
#define BACKGROUND_COLOR (HBRUSH) (COLOR_GRAYTEXT + 1)
背景色: COLOR_HIGHLIGHT
#define BACKGROUND_COLOR (HBRUSH) (COLOR_HIGHLIGHT + 1)
背景色: COLOR_HIGHLIGHTTEXT
#define BACKGROUND_COLOR (HBRUSH) (COLOR_HIGHLIGHTTEXT + 1)
背景色: COLOR_WINDOWTEXT
#define BACKGROUND_COLOR (HBRUSH) (COLOR_WINDOWTEXT + 1)
背景カラーを指定してレンダリングを行っているのはウィンドウプロシージャの中だ。つまり、ウィンドウクラスで指定したウィンドウプロシージャが呼び出されて処理が走っていることがわかる。そして、背景カラーも指定した色でレンダリングされていることを確認できる。