我想知道Windows程序中WM_QUIT,WM_CLOSE和WM_DESTROY消息之间有什么区别,基本上是:它们何时发送,除了程序定义之外,它们还有任何自动效果吗?
adf*_*f88 80
他们是完全不同的.
WM_CLOSE按"X"时发送到窗口或从窗口菜单中选择"关闭".如果您收到此消息,这是您的电话如何对待它 - 忽略它或真正关闭窗口.默认情况下,WM_CLOSE传递给DefWindowProc导致窗口被销毁.当窗口被销毁时,WM_DESTROY将发送消息.在这个阶段,相反WM_CLOSE,你无法阻止这个过程,你只能进行必要的清理.但请记住,当你WM_DESTROY在所有儿童窗户已经被摧毁之前捕获时.WM_NCDESTROY在所有子窗口被销毁之后发送.
WM_QUITmessage与任何窗口无关(hwnd得到的GetMessage是NULL,没有调用窗口过程).此消息表明应停止消息循环并应关闭应用程序.当GetMessage读取WM_QUIT返回0来表示.看一下典型的消息循环片段 - 循环继续,同时GetMessage返回非零.WM_QUIT可以通过PostQuitMessage功能发送.通常在主窗口接收时调用此函数WM_DESTROY(请参阅典型的窗口过程片段).
use*_*297 10
首先,WM_CLOSE和WM_DESTROY消息与特定窗口相关联,而WM_QUIT消息适用于整个应用程序(井线程),并且消息永远不会通过窗口过程(WndProc例程)接收,而只能通过GetMessage或PeekMessage函数接收.
在您的WndProc例程中,该DefWindowProc函数负责处理这些消息的默认行为.该WM_CLOSE,应用程序应该关闭,为此默认behavoir消息请求是调用DestroyWindow函数.它在DestroyWindow调用此函数时发送WM_DESTROY消息.请注意,WM_CLOSE只是请求您关闭的消息(如WM_QUIT) - 您实际上不必退出/退出.但是WM_DESTROY消息告诉你,你的窗口IS关闭和破坏,所以你必须清除任何资源,把手等.
只是因此它不会在评论中迷失...不要忘记WM_CANCEL.当您单击MFC对话框上的关闭(x)按钮时,它肯定会发送WM_CLOSE.然后默认OnClose()函数将调用默认(基类)OnCancel()函数.
但是,如果你只是键入ESC键,这将导致对话框的关闭,但(据我所知),而不生成WM_CLOSE事件 - 它直接进入WM_CANCEL/OnCancel()机制.
我在此邀请社群详细阐述这一点......或者将该详细内容编辑成已接受的答案.