おとついの晩ご飯

忘れやすいので忘れたくないことを書いています。

【C++】Windowsデスクトップアプリケーション 処理の流れについて

問題

初めてC++Windowsデスクトップアプリケーションを作成したときに、 最初から入ってるソースコード(Visual Studioのテンプレート)でどういった処理が行われているのかわからず 色々と調べることになった。

C#のようにMain関数があるだけでなく、いろんな関数があるので理解できるまではややこしく感じる。

自分なりの理解

wWInMain エントリーポイント

int APIENTRY wWInMain(_In_ HINSTANCE hInstance,
                      _In_opt_ HINSTANCE hPrevInstance,
                      _In_ LPWSTR lpCmdLine,
                      _In_ int nCmndShow)

この関数からプログラムがスタートする。
関数内でアプリケーションの初期化などを行う。
その後、GetMessageが呼ばれる。


GetMessage関数

while (GetMessage(&msg, nullptr, 0, 0))
{
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

Windowsから送られたメッセージを受けて、処理を行う箇所。

例えば、マウスの操作やキーボード操作、アプリを起動してウインドウが作成されたときや、 終了したときなど様々なメッセージがくる。

メッセージがないときは、ループは回らず、メッセージを受けたときのみ処理が行われる。

こちら側でなにも設定せずとも、待ってくれるので逆にどうやって待っているかわからず悩んでいた。


TranslateMessage関数

Whileの中で呼ばれる。
キーボードからメッセージを色々する関数みたい。
自分が色々触ったときは、キーボードどうこうはあまり必要なかったのでスルー。


DispatchMessage関数

Whileの中で呼ばれるもうひとつの関数。
この関数からメッセーををWndProc関数へ送って処理する。


WndProc関数

WndProc関数の中身は以下の様になっている

switch (message)
{
case WM_COMMAND:
    {
    ・・・省略・・・
    }
case WM_PAINT:
    {
    ・・・省略・・・
    }
case WM_DESTROY:
    {
        PostQuitMessage(0);
        break;
    }
default:
    return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;

見てわかるように受けたメッセージの種類ごとに行う処理を分けている。
例えば、WM_DESTROYを受けたときは、PostQuitMessage関数を呼び出して、アプリケーションを終了させる。
こういった感じに、WM_CREATEでアプリ開始時にウインドウが作成されるタイミングではこの処理を行う、WM_CLOSEでアプリのウィンドウが閉じられる(終了)ときにこの処理を行うといったことが可能。


一旦ここまで、おおまかな流れは理解したつもり。。。