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),其中包含OK和Cancel按钮。如果用户单击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消息的典型方法: