===== ウィンドウクラス(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 | 出来事に応じた処理 | 郵便に返事する係 |