關閉視窗

當使用者關閉視窗時,該動作會觸發一連串的視窗訊息。

使用者可以按一下 [ 關閉 ] 按鈕,或使用 ALT+F4 之類的鍵盤快速鍵來關閉應用程式視窗。 其中任何一個動作都會讓視窗接收 WM_CLOSE 訊息。 WM_CLOSE訊息可讓您有機會在關閉視窗之前提示使用者。 如果您真的想要關閉視窗,請呼叫 DestroyWindow 函式。 否則,只要從 WM_CLOSE 訊息傳回零,作業系統就會忽略訊息,而不會終結視窗。

以下是程式如何處理 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 函式會顯示包含 [確定 ] 和 [ 取消 ] 按鈕的強制回應對話方塊。 如果使用者按一下 [確定],程式會呼叫 DestroyWindow。 否則,如果使用者按一下 [ 取消],則會略過 DestroyWindow 的呼叫,而且視窗會保持開啟狀態。 不論是哪一種情況,都傳回零表示您已處理訊息。

如果您想要關閉視窗而不提示使用者,您可以直接呼叫 DestroyWindow 而不呼叫 MessageBox。 不過,在此情況下會有快捷方式。 回想一下 ,DefWindowProc 會針對任何視窗訊息執行預設動作。 在 WM_CLOSE的情況下, DefWindowProc 會自動呼叫 DestroyWindow。 這表示如果您忽略switch語句中的WM_CLOSE訊息,則預設會終結視窗。

當視窗即將終結時,它會收到 WM_DESTROY 訊息。 此訊息會在視窗從畫面移除之後傳送,但在解構發生之前, (,在損毀任何子視窗之前) 。

在主應用程式視窗中,您通常會呼叫PostQuitMessage來回應WM_DESTROY

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;

我們在 [視窗訊息 ] 區段中看到 PostQuitMessage 在訊息佇列上放置 WM_QUIT 訊息,導致訊息迴圈結束。

以下是流程圖,顯示處理 WM_CLOSEWM_DESTROY 訊息的一般方式:

顯示如何處理 wm-close 和 wm-destroy 訊息的流程圖

下一個

管理應用程式狀態