首页 > 技术文章 > 1.5 Closing the Window(关闭窗口)

wainzhang 2018-07-26 16:25 原文

Closing the Window 关闭窗口

当用户关闭一个窗口时,该操作将触发一系列窗口消息。

用户可以通过单击close按钮或使用键盘快捷方式(如ALT+F4)关闭应用程序窗口。任何这些操作都会导致窗口接收WM_CLOSE消息。WM_CLOSE消息使您有机会在关闭窗口之前提示用户。如果您确实想关闭窗口,请调用DestroyWindow函数。否则,只需从WM_CLOSE消息返回0,操作系统将忽略该消息,而不会销毁窗口。

下面是一个程序如何处理 WM_CLOSE的示例。

C++

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函数显示一个模态对话框(modal dialog),其中包含OKCancel按钮。如果用户单击OK,程序将调用 DestroyWindow。否则,如果用户单击Cancel,将跳过对DestroyWindow的调用,窗口将保持打开状态。在这两种情况下,最终返回0表示您处理了消息。

如果您想在不提示用户的情况下关闭窗口,您可以简单地调用DestroyWindow而不调用MessageBox。然而,在这种情况下有一个捷径。回想一下,DefWindowProc对任何窗口消息执行默认操作。对于WM_CLOSE, DefWindowProc自动调用DestroyWindow。这意味着如果您在switch语句中忽略WM_CLOSE消息,那么默认情况下,窗口将被销毁。

当窗口即将被销毁时,它将收到一个WM_DESTROY 消息。此消息在窗口从屏幕中删除之后发送,但是在销毁发生之前(特别是在任何子窗口被销毁之前)。

在主应用程序窗口中,通常通过调用PostQuitMessage来响应WM_DESTROY

C++

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;

 

我们在此前的Window Messages教学部分看到PostQuitMessage在消息队列上放置了一个WM_QUIT消息,导致消息循环结束。

下面是一个流程图,展示了处理 WM_CLOSE 和 WM_DESTROY消息的典型方法:

 

 

推荐阅读