ウィンドウクラス(WNDCLASSEX)の詳細解説

ウィンドウを作るには、まず「設計図」を作る必要があります。 その設計図が \*\*ウィンドウクラス(`WNDCLASSEX`構造体)\*\*です。

WNDCLASSEX wc = {};
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
c.lpfnWndProc = WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = nullptr;
wc.lpszClassName = L"MyWindowClass";
wc.hIconSm = LoadIcon(nullptr, IDI_APPLICATION);

フィールド別の説明

メンバ名 意味・説明
`cbSize` この構造体のサイズ。`sizeof(WNDCLASSEX)` を指定するのが決まり。
`style` ウィンドウの動作スタイル(再描画のタイミングなど)。例:`CS_HREDRAW CS_VREDRAW`
`lpfnWndProc` メッセージを処理する関数(`WinProc`)のアドレスを指定。
`cbClsExtra` 拡張クラス情報のバイト数(基本は 0)。
`cbWndExtra` 拡張ウィンドウ情報のバイト数(基本は 0)。
`hInstance` このウィンドウを作るプログラムのインスタンスハンドル。
`hIcon` アプリケーションのアイコン。`LoadIcon` で標準アイコンを指定可能。
`hCursor` ウィンドウ上で表示されるマウスカーソル。
`hbrBackground` ウィンドウの背景色(ブラシ)。例:`(HBRUSH)(COLOR_WINDOW+1)`
`lpszMenuName` メニューリソースの名前(使わない場合は `nullptr`)。
`lpszClassName` このウィンドウクラスの名前(任意の文字列)。`CreateWindowEx` に渡す。
`hIconSm` タスクバーなどに表示される小さいアイコン。`hIcon`と同じでOK。

よく使う値一覧

▼ style(再描画のスタイル)

定数 意味
———— ———–
`CS_HREDRAW` 横サイズ変更時に再描画
`CS_VREDRAW` 縦サイズ変更時に再描画

▼ hbrBackground(背景色ブラシ)

定数
—————– ————-
`COLOR_WINDOW+1` 通常の白背景
`COLOR_BTNFACE+1` グレー背景(ボタンと同じ)
`nullptr` 背景塗らない(自分で描画)

▼ hCursor(カーソル)

定数 意味
———– ———
`IDC_ARROW` 通常の矢印
`IDC_HAND` リンクっぽい手の形
`IDC_WAIT` 砂時計

よくあるエラーと注意点

* `cbSize` を設定し忘れると `RegisterClassEx` で失敗します。 * `lpszClassName` と `CreateWindowEx` で渡すクラス名が一致してないと ウィンドウ作成に失敗します。 * `hIconSm` や `hCursor` に `nullptr` を指定すると、何も表示されないことがあるので注意。

==== 登録と使い方(まとめ) ====

// 登録
RegisterClassEx(\&wc);
 
// 作成(クラス名は上で設定したものを使う)
CreateWindowEx(0, L"MyWindowClass", ... ); 

まとめ

要素 役割 イメージ
WinMain ゲームの開始点 C++のmain関数のようなもの
RegisterClassEx ウィンドウの設計図を作る 図面を描く
CreateWindowEx ウィンドウを作る 部屋を建てる
ShowWindow 表示命令 部屋を見せる
メッセージループ 出来事の監視と処理 郵便の仕分け係
WinProc 出来事に応じた処理 郵便に返事する係