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