# Windowsプログラミングの初めの一歩手前の穴

##### メッセージループとコールバックとWinProc

## 🎮 たとえるなら…

### ゲームセンターの受付とスタッフの関係！

---

### 🌀「メッセージループ」は、****ゲームセンターの受付のお兄さん****

- 毎日ずっと、お客さん（メッセージ）が来るのを待ってる。
- お客さんが来たら、「どのゲームに用事があるのかな？」と考えて、そのゲームの担当スタッフに「お客さん来たよ！」と伝える。

```cpp
// ゲームセンター受付のお兄さん（これがメッセージループ）
while (お客さんが来たら) {
    お客さんの内容を読む（TranslateMessage）
    担当スタッフに渡す（DispatchMessage）
}
```

---

### 🧑‍🔧「WndProc（ウィンドウプロシージャ）」は、****ゲーム機のスタッフ****

- 受付から「○○の用事の人が来たよ」と聞いたら、
    - 「遊びたいのかな？」
    - 「壊れたのかな？」
    - 「帰りたいのかな？」  
        …を判断して、それに応じた行動をする。

```cpp
// ゲーム機のスタッフ（WndProc）
switch (お客さんの用事) {
    case 「遊びたい」:
        → スタートボタン押す
    case 「壊れてる」:
        → 修理する
    case 「帰る」:
        → ゲーム終了
    default:
        → 本社（OS）に任せる
}
```

---

## 🔁 2人の連携で成り立ってる！

<table id="bkmrk-%E8%AA%B0%EF%BC%9F%E5%BD%B9%E5%89%B2%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%83%AB%E3%83%BC%E3%83%97%EF%BC%88%E5%8F%97%E4%BB%98%EF%BC%89%E3%81%8A%E5%AE%A2%E3%81%95%E3%82%93"><colgroup><col></col><col></col></colgroup><tbody><tr><th>誰？

</th><th>役割

</th></tr><tr><td>メッセージループ（受付）

</td><td>お客さん（イベント）を拾ってスタッフに渡す

</td></tr><tr><td>WndProc（スタッフ）

</td><td>イベントに合わせて処理する（絵を描く・音を出す・終了する）

</td></tr></tbody></table>

---

## 🎨 具体例（「絵を描いて！」って言われたら？）

1. Windows（OS）が「このウィンドウ、描き直してね！」って言う（WM\_PAINTというイベントが届く）
2. メッセージループがそれを受け取って、WndProcに渡す
3. WndProcが「よし、描き直そう」と絵を描く処理をする

---

## 📌 まとめ

<table id="bkmrk-%E7%8F%BE%E8%B1%A1%E4%BE%8B%E3%81%88%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%B8%8A%E3%81%A7%E3%81%AF%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%8C%E5%B1%8A%E3%81%8F%E3%81%8A"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>現象

</th><th>例え

</th><th>プログラム上では

</th></tr><tr><td>イベントが届く

</td><td>お客さんが来る

</td><td>Windows がメッセージを出す

</td></tr><tr><td>メッセージループ

</td><td>受付のお兄さん

</td><td>GetMessage → DispatchMessage

</td></tr><tr><td>WndProc

</td><td>スタッフ

</td><td>イベントに応じた処理をする関数

</td></tr></tbody></table>

---

> <span style="white-space: pre-wrap;">つまり、「メッセージループ」が </span>****お知らせを渡す人****、  
> <span style="white-space: pre-wrap;">「WndProc」が </span>****実際に処理をする人****<span style="white-space: pre-wrap;"> です！</span>

---

## 🧠 まず「コールバック」とは？

### ✅ 意味：

****自分で作った関数だけど、あとで誰か（＝OSやライブラリ）が呼んでくれる関数****のことです。

---

## 🎮 たとえるなら…「イベント係に任せる自作の処理」

たとえば、学校でイベントをやるとして…

- 「ボタンを押されたときにこの処理をしてね」  
    → と****先生（OS）にお願いしておく****
- 実際にボタンが押されたら、****先生があなたの関数を呼んでくれる****

<span style="white-space: pre-wrap;">これが </span>****コールバック****<span style="white-space: pre-wrap;"> です。</span>

---

## 🪟 WndProc とは何か？

### ✅ 意味：

WndProc は、\*\*「ウィンドウに届いたメッセージをどう処理するかを書く関数」\*\*です。

例えば、

- ウィンドウが閉じられた → 終了させる
- 再描画してほしい → 画面を描き直す
- キーが押された → 入力処理する

などを処理する関数です。

---

## 💡 WndProcは「OSに登録するコールバック関数」

あなたは最初にこう書きます：

```cpp
wc.lpfnWndProc = MyWindowProc;
```

これは、

> <span style="white-space: pre-wrap;">「このウィンドウの処理は </span>****MyWindowProc() という関数を使ってね！****」

と****OSに登録してる****ということです。

---

## 📞 呼び出しの流れ（コールバックの仕組み）

1. ユーザーが何か操作する（例：ウィンドウを閉じる）
2. OSが「メッセージ」を作って、プログラムに送る
3. プログラムの「メッセージループ」がそのメッセージを受け取る
4. <span style="white-space: pre-wrap;">登録された </span>****WndProc関数（コールバック）****<span style="white-space: pre-wrap;"> が呼ばれる！</span>

---

## 🎨 たとえ話まとめ：先生と出席係

<table id="bkmrk-%E5%BD%B9%E5%89%B2%E3%81%9F%E3%81%A8%E3%81%88%E5%AE%9F%E9%9A%9B%E3%81%AE%E5%90%8D%E5%89%8D%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%8C%E8%B5%B7%E3%81%8D%E3%82%8B%E7%94%9F%E5%BE%92"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>役割

</th><th>たとえ

</th><th>実際の名前

</th></tr><tr><td>イベントが起きる

</td><td>生徒が手をあげる

</td><td>OSがメッセージを送る

</td></tr><tr><td>受付が確認

</td><td>出席係が生徒を見つける

</td><td>メッセージループ

</td></tr><tr><td>処理担当が動く

</td><td>先生がその子に対応する

</td><td>`<span class="editor-theme-code">WndProc()</span>`

</td></tr><tr><td>呼ばれる仕組み

</td><td>担任を事前に登録しておいた

</td><td>コールバック関数

</td></tr></tbody></table>

---

## ✅ 結論まとめ（超ざっくり）

<table id="bkmrk-%E7%94%A8%E8%AA%9E%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E6%84%8F%E5%91%B3%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0os%E3%81%AB%E3%80%8C"><colgroup><col></col><col></col></colgroup><tbody><tr><th>用語

</th><th>やさしい意味

</th></tr><tr><td>コールバック関数

</td><td>OSに「この関数をあとで呼んでね」と渡しておく関数

</td></tr><tr><td>WndProc

</td><td>ウィンドウの出来事を処理するコールバック関数

</td></tr><tr><td>lpfnWndProc

</td><td>「WndProcはこれだよ」とOSに登録するための場所

</td></tr><tr><td>呼び出し

</td><td>イベントが起きたらOSが自動で呼んでくれる（＝コールバック）

</td></tr></tbody></table>