メッセージループとWinProc(ウィンドウプロシージャ)の関係

はじめに:パソコンの中の「受付カウンター」だと思おう

ゲームやアプリのウィンドウは、「人の出入りがある受付カウンター」だと思ってください。この受付では次のようなことが起きます:

誰かがマウスをクリックした

キーボードを押した

ウィンドウを閉じようとしたこういった出来事(イベント)は、「メッセージ」としてパソコン内に届けられます。

1. メッセージとは?

Windowsは、「○○が起きましたよ」という通知をメッセージという形で送ってきます。

たとえば:

2. メッセージループ:ポスト(郵便受け)をチェックし続ける

アプリの中には「郵便受け(メッセージキュー)」があり、そこにメッセージがどんどん届きます。 メッセージループは、その郵便受けをずっと見張って、届いたら処理に回す係です。

3. WinProc(ウィンドウプロシージャ):メッセージを受け取って処理する関数

WinProcは、受付係(または配達先の人)です。 メッセージループから渡された「出来事(メッセージ)」に応じて、どう処理するかを決めます。

return DefWindowProc(hwnd, msg, wParam, lParam); // 他はWindowsに任せる
 
}

4. たとえ話でまとめると…

実体 たとえ
メッセージ 郵便や伝票:「何が起きたか」の情報
メッセージループ 郵便受けを見張る人+仕分け係
DispatchMessage 書類を担当者に回す作業
WinProc 実際に中身を読んで処理する人

5. よくある勘違いと注意点

6. まとめ:全体の流れイメージ図

[ユーザーがマウスをクリック]
        ↓
[WindowsがWM_LBUTTONDOWNメッセージを送る]
        ↓
[メッセージループでPeekMessageが受け取る]
        ↓
[DispatchMessageでWinProcに転送]
        ↓
[WinProcが switch(msg) で判定して処理]

まとめ

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