ウィンドウを作るには、まず「設計図」を作る必要があります。 その設計図が \*\*ウィンドウクラス(`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 | 出来事に応じた処理 | 郵便に返事する係 |