关闭窗口

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

用户可以通过单击“ 关闭 ”按钮或使用 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 消息。 此消息在从屏幕中删除窗口之后,但在销毁发生之前, (特别是在) 销毁任何子窗口之前发送。

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

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;

我们在 “窗口消息 ”部分看到 ,PostQuitMessageWM_QUIT 消息置于消息队列中,导致消息循环结束。

下面是一个流程图,其中显示了处理 WM_CLOSEWM_DESTROY 消息的典型方法:

显示如何处理 wm-close 和 wm-destroy 消息的流程图

下一步

管理应用程序状态