前置き
ウィンドウプロシージャおよびメッセージとはいったい何か気になったので調べた。
ここでは、ウィンドウプロシージャとは何か。メッセージとは何かまでを記述する。
理解していると思うが、もしかすると間違ってるかもしれない(テヘペロ
Win32API
Win32APIとは、Windowsが提供しているOSのAPI。
ウィンドウの作成、表示、描画、スレッドの実行などなどが行える。
Win32APIの32は32ビットの意味。
64ビットだとWin64APIになり、16ビットだとWin16APIになる。
Windowsアプリケーションを作成するには
Windowsアプリケーションを作成するには下記の手順が必要である。
- ウィンドウの作成
- メッセージループ
- ウィンドウプロシージャの定義
ここで、メッセージループおよびウインドウプロシージャが出てくる。
ウィンドウの作成、メッセージループ、ウィンドウプロシージャの定義の方法およびコードは、参考文献に任せるとして、ここでは、メッセージループおよびウィンドウプロシージャが何かを説明していく。
メッセージループ
メッセージループとは、メッセージキューに格納されたメッセージを取り出し、ウインドウプロシージャに渡す処理である。
メッセージとウィンドウプロシージャについて説明する。
メッセージ
メッセージとは、発生したイベント内容を記述した変数である。
ウィンドウ上でイベントが発生した時、そのイベント内容を記述したメッセージが生成される。
例えば、メモ帳のウィンドウ上で右クリックした場合、WM_RBUTTONDOWN というメッセージが生成される。
メモ帳は WM_RBUTTONDOWN のメッセージを受け取り、右クリックのメニューを生成している。
ウィンドウプロシージャ
ウィンドウプロシージャとは、受け取ったメッセージを処理する関数である。
コードで表すと下記のようになる。
WndProc()がウィンドウプロシージャである。(WndProcはWindowProcudureの略)
ここでは、左クリックした時に何かしらの処理を行っている。
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
switch (msg) { // メッセージを判定
case WM_LBUTTONDOWN: // 左クリックされた時
DoAnything(); // なんでもしますから!
return 0;
return DefWindowProc(hwnd , msg , wp , lp);
}
このように、開発者はウィンドウプロシージャに、受け取ったメッセージを判定した処理内容を記述していく。
メッセージループについてもう少し詳しく
Windowsのシステムは、ウィンドウが属するアプリケーション毎にメッセージキューを持っている。メッセージキューとはメッセージが格納されているキューの事である。(まんまやね)
ウィンドウ上でイベントが発生すると、メッセージが生成され、メッセージキューに格納される。
そのメッセージキューに格納されたメッセージを取り出し、ウィンドウプロシージャに渡すのがメッセージループの役割である。
具体的には、
メッセージキューからメッセージを取り出す GetMessage() と、
メッセージをウィンドウプロシージャに渡す DispatchMessage() を使う。
// メッセージを取り出して、ウィンドウプロシージャに渡している
while (GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
まとめ
つまり、
- メッセージ:イベント内容
- メッセージループ:メッセージを取り出して、ウィンドウプロシージャに渡す処理
- ウィンドウプロシージャ:メッセージを受け取り、イベントごとの処理を記述するもの
である。