===== メッセージループとWinProc(ウィンドウプロシージャ)の関係 ===== ===== はじめに:パソコンの中の「受付カウンター」だと思おう ===== ゲームやアプリのウィンドウは、「人の出入りがある受付カウンター」だと思ってください。この受付では次のようなことが起きます: 誰かがマウスをクリックした キーボードを押した ウィンドウを閉じようとしたこういった出来事(イベント)は、「メッセージ」としてパソコン内に届けられます。 ===== 1. メッセージとは? ===== Windowsは、「○○が起きましたよ」という通知をメッセージという形で送ってきます。 たとえば: * 「WM_KEYDOWN」 → キーボードが押された * 「WM_LBUTTONDOWN」 → マウスの左ボタンが押された * 「WM_DESTROY」 → ウィンドウを閉じようとしている ===== 2. メッセージループ:ポスト(郵便受け)をチェックし続ける ===== アプリの中には「郵便受け(メッセージキュー)」があり、そこにメッセージがどんどん届きます。 メッセージループは、その郵便受けをずっと見張って、届いたら処理に回す係です。 ===== 3. WinProc(ウィンドウプロシージャ):メッセージを受け取って処理する関数 ===== WinProcは、**受付係(または配達先の人)**です。 メッセージループから渡された「出来事(メッセージ)」に応じて、どう処理するかを決めます。 return DefWindowProc(hwnd, msg, wParam, lParam); // 他はWindowsに任せる } ===== 4. たとえ話でまとめると… ===== ^ 実体 ^ たとえ ^ | メッセージ | 郵便や伝票:「何が起きたか」の情報 | | メッセージループ | 郵便受けを見張る人+仕分け係 | | DispatchMessage | 書類を担当者に回す作業 | | WinProc | 実際に中身を読んで処理する人 | ===== 5. よくある勘違いと注意点 ===== * 「WinProcはずっと動いてる」 → × 間違い! * WinProcは、何かメッセージが届いたときだけ呼ばれる関数です。 * ゲームの描画やロジック処理はWinProcに書く? → × 基本はメッセージループのelse側に書く! * WinProcは「イベント処理」、ゲームの更新は「メインループ内で別にやる」が原則。 ===== 6. まとめ:全体の流れイメージ図 ===== [ユーザーがマウスをクリック] ↓ [WindowsがWM_LBUTTONDOWNメッセージを送る] ↓ [メッセージループでPeekMessageが受け取る] ↓ [DispatchMessageでWinProcに転送] ↓ [WinProcが switch(msg) で判定して処理] ===== まとめ ===== ^ 要素 ^ 役割 ^ イメージ ^ | WinMain | ゲームの開始点 | C++のmain関数のようなもの | | RegisterClassEx | ウィンドウの設計図を作る | 図面を描く | | CreateWindowEx | ウィンドウを作る | 部屋を建てる | | ShowWindow | 表示命令 | 部屋を見せる | | メッセージループ | 出来事の監視と処理 | 郵便の仕分け係 | | WinProc | 出来事に応じた処理 | 郵便に返事する係 |