当用户关闭窗口时,该操作会触发一系列窗口消息。
用户可以通过单击关闭按钮或使用诸如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函数显示一个包含OK和Cancel按钮的模式对话框。如果用户点击确定,程序调用DestroyWindow。否则,如果用户单击Cancel,则将忽略对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_CLOSE和WM_DESTROY消息的典型方法:
显示如何处理WM_CLOSE和WM_DESTROY消息的流程图
下一个
管理应用程序状态
原文链接:Closing the Window