ウィンドウを閉じる

ユーザーがウィンドウを閉じると、そのアクションによって一連のウィンドウ メッセージがトリガーされます。

ユーザーは、[ じる] ボタンをクリックするか、Alt + F4 などのキーボード ショートカットを使用して、アプリケーション ウィンドウを閉じることができます。 これらのアクションのいずれかを実行すると、ウィンドウは WM_CLOSE メッセージを受信します。 WM_CLOSE メッセージは、ウィンドウを閉じる前にユーザーにプロンプトを表示する機会を提供します。 ウィンドウを閉じる場合は、 DestroyWindow 関数を呼び出します。 それ以外の場合は、 WM_CLOSE メッセージから 0 を返すだけで、オペレーティング システムはメッセージを無視し、ウィンドウを破棄しません。

プログラムがWM_CLOSEを処理する方法の例を次 に示します

case WM_CLOSE:
    if (MessageBox(hwnd, L"Really quit?", L"My application", MB_OKCANCEL) == IDOK)
    {
        DestroyWindow(hwnd);
    }
    // Else: User canceled. Do nothing.
    return 0;

この例では、 MessageBox 関数は 、[OK] ボタンと [キャンセル ] ボタンを含むモーダル ダイアログを表示します。 ユーザーが [OK] をクリックすると、プログラムは DestroyWindow を呼び出します。 それ以外の場合、ユーザーが [キャンセル] をクリックした場合、 DestroyWindow の呼び出しはスキップされ、ウィンドウは開いたままです。 どちらの場合も、メッセージを処理したことを示す 0 を返します。

ユーザーにメッセージを表示せずにウィンドウを閉じる場合は、MessageBox を呼び出さずに DestroyWindow を呼び出します。 ただし、この場合はショートカットがあります。 DefWindowProc は、任意のウィンドウ メッセージに対して既定のアクションを実行することを思い出してください。 WM_CLOSEの場合、DefWindowProc はDestroyWindow を自動的に呼び出します。 つまり、switch ステートメントのWM_CLOSE メッセージを無視すると、ウィンドウは既定で破棄されます。

ウィンドウが破棄されると、 WM_DESTROY メッセージが表示されます。 このメッセージは、ウィンドウが画面から削除された後、破棄が発生する前 (特に、子ウィンドウが破棄される前) に送信されます。

メイン アプリケーション ウィンドウでは、通常、PostQuitMessage を呼び出してWM_DESTROYに応答します。

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;

[ ウィンドウ メッセージ ] セクションで、 PostQuitMessage がメッセージ キューに WM_QUIT メッセージを配置し、メッセージ ループが終了したことを確認しました。

WM_CLOSEメッセージと WM_DESTROY メッセージを処理する一般的な方法を示すフローチャートを次 示します。

wm-close メッセージと wm-destroy メッセージを処理する方法を示すフローチャート

次へ

アプリケーション状態の管理