LoginSignup
10
10

More than 5 years have passed since last update.

Win32APIにおけるメッセージとウィンドウプロシージャについてのメモ

Posted at

前置き

ウィンドウプロシージャおよびメッセージとはいったい何か気になったので調べた。
ここでは、ウィンドウプロシージャとは何か。メッセージとは何かまでを記述する。
理解していると思うが、もしかすると間違ってるかもしれない(テヘペロ

Win32API

Win32APIとは、Windowsが提供しているOSのAPI。
ウィンドウの作成、表示、描画、スレッドの実行などなどが行える。
Win32APIの32は32ビットの意味。
64ビットだとWin64APIになり、16ビットだとWin16APIになる。

Windowsアプリケーションを作成するには

Windowsアプリケーションを作成するには下記の手順が必要である。

  1. ウィンドウの作成
  2. メッセージループ
  3. ウィンドウプロシージャの定義

ここで、メッセージループおよびウインドウプロシージャが出てくる。
ウィンドウの作成、メッセージループ、ウィンドウプロシージャの定義の方法およびコードは、参考文献に任せるとして、ここでは、メッセージループおよびウィンドウプロシージャが何かを説明していく。

メッセージループ

メッセージループとは、メッセージキューに格納されたメッセージを取り出し、ウインドウプロシージャに渡す処理である。

メッセージとウィンドウプロシージャについて説明する。

メッセージ

メッセージとは、発生したイベント内容を記述した変数である。

ウィンドウ上でイベントが発生した時、そのイベント内容を記述したメッセージが生成される。
例えば、メモ帳のウィンドウ上で右クリックした場合、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);

まとめ

つまり、

  • メッセージ:イベント内容
  • メッセージループ:メッセージを取り出して、ウィンドウプロシージャに渡す処理
  • ウィンドウプロシージャ:メッセージを受け取り、イベントごとの処理を記述するもの

である。

参考文献

標準 Windows API
プログラミング入門サイト~bituse~
EternalWindows

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10