バックグラウンドカラーとウィンドウプロシージャ

前回は、ウィンドウクラスで登録するカーソルを変更することで、ウィンドウ内で表示されるマウスカーソルを変更するサンプルと取り上げた。今回は、背景カラーで同じことをやってみよう。ウィンドウクラスを設定する次の部分だ。

ウィンドウクラスを設定している部分

    // ウィンドウクラス構造体を用意
    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_WINDOW

    背景色: COLOR_WINDOW

では、この部分の色指定を変えながらビルドして実行してみよう。実行すると次のようになる。

背景色: COLOR_ACTIVECAPTION

#define BACKGROUND_COLOR (HBRUSH) (COLOR_ACTIVECAPTION + 1)
  • 背景色: COLOR_ACTIVECAPTION

    背景色: COLOR_ACTIVECAPTION

背景色: COLOR_APPWORKSPACE

#define BACKGROUND_COLOR (HBRUSH) (COLOR_APPWORKSPACE + 1)
  • 背景色: COLOR_APPWORKSPACE

    背景色: COLOR_APPWORKSPACE

背景色: COLOR_BTNTEXT

#define BACKGROUND_COLOR (HBRUSH) (COLOR_BTNTEXT + 1)
  • 背景色: COLOR_BTNTEXT

    背景色: COLOR_BTNTEXT

背景色: COLOR_GRAYTEXT

#define BACKGROUND_COLOR (HBRUSH) (COLOR_GRAYTEXT + 1)
  • 背景色: COLOR_GRAYTEXT

    背景色: COLOR_GRAYTEXT

背景色: COLOR_HIGHLIGHT

#define BACKGROUND_COLOR (HBRUSH) (COLOR_HIGHLIGHT + 1)
  • 背景色: COLOR_HIGHLIGHT

    背景色: COLOR_HIGHLIGHT

背景色: COLOR_HIGHLIGHTTEXT

#define BACKGROUND_COLOR (HBRUSH) (COLOR_HIGHLIGHTTEXT + 1)
  • 背景色: COLOR_HIGHLIGHTTEXT

    背景色: COLOR_HIGHLIGHTTEXT

背景色: COLOR_WINDOWTEXT

#define BACKGROUND_COLOR (HBRUSH) (COLOR_WINDOWTEXT + 1)
  • 背景色: COLOR_WINDOWTEXT

    背景色: COLOR_WINDOWTEXT

背景カラーを指定してレンダリングを行っているのはウィンドウプロシージャの中だ。つまり、ウィンドウクラスで指定したウィンドウプロシージャが呼び出されて処理が走っていることがわかる。そして、背景カラーも指定した色でレンダリングされていることを確認できる。