通过上面的学习你以及了解了 如何创建一个窗口,假若你想关闭当前窗口,那么你就要直到如何处理窗口关闭消息。

用户可以随时点击右上角的关闭按钮或者使用键盘上的 ALT+F4 组合键关闭一个应用程序,这两种方式都会触发 WM_CLOSE 消息。

WM_CLOSE 消息可以在用户关闭窗口之前给出一个友好的提示信息。如果你确认想要关闭窗口,则可以直接调用 DestoryWindows 函数,否则,只需要简单的返回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 函数会展示一个包含确定和取消按钮的模态对话框,如果用户点击确定,程序就会调用 DestoryWindows 销毁窗口。如果用户点击取消,则会跳过 DestoryWindows,不会做任何改变。任何情况下,返回0 代表着你已经处理了该消息。

如果你想直接关闭窗口而不显示任何提示信息,你只要简单的调用 DestoryWindows 即可。其实还有一种更简单的方法,就是直接不做任何处理,直接将消息传递给 DefWindowProc 函数,该函数会执行消息的默认行为,而 WM_CLOSE 消息的默认行为就会自动销毁窗口。

当一个窗口销毁之后,会收到 WM_DESTORY 消息。这个条消息是在窗口从屏幕中移除之后,真正销毁窗口之前发送的。

在你的主应用程序中,典型的响应 WM_DESTORY 消息的代码是调用 PostQuitMessage 函数。

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;

PostQuitMessage 函数内部会将 WM_QUIT 消息放到消息队列,在消息循环中读取到 WM_QUIT 消息,会直接退出消息循环,关闭程序。

下面是处理 WM_CLOSE 和 WM_DESTORY 消息的典型流程:

关闭流程