在windows程序中WM_QUIT,WM_CLOSE和WM_DESTROY有什么区别?
我想知道WM_QUIT,WM_CLOSE和WM_DESTROY消息之间的区别是什么,在Windows程序,本质上:他们什么时候发送,除了什么是由程序定义的任何自动效果?
他们完全不同。
当按下“X”或从窗口菜单中select“closures”时, WM_CLOSE
被发送到窗口。 如果你听到这个消息,这是你的电话如何对待它 – 忽略它或真正closures窗口。 默认情况下,传递给DefWindowProc
WM_CLOSE
会导致窗口被销毁。 当窗口正在销毁WM_DESTROY
消息被发送。 在这个阶段,反对WM_CLOSE
,你不能停止这个过程,你只能做一个必要的清理。 但是请记住,当你在所有子窗口被破坏之前捕获WM_DESTROY
时。 WM_NCDESTROY
在所有的子窗口被销毁之后发送。
WM_QUIT
消息与任何窗口无关(从GetMessage
获得的hwnd
是NULL,并且没有窗口过程被调用)。 此消息指示应停止消息循环并closures应用程序。 当GetMessage
读取WM_QUIT
它将返回0来指示。 看看典型的消息循环片断 – 循环继续,而GetMessage
返回非零。 WM_QUIT
可以通过PostQuitMessage
函数发送。 当主窗口接收WM_DESTROY
时,通常会调用此函数(请参见典型的窗口过程代码段 )。
首先, WM_CLOSE和WM_DESTROY消息与特定的窗口相关联,而WM_QUIT消息适用于整个应用程序(良好的线程),并且消息永远不会通过窗口过程( WndProc
例程)接收,而只能通过GetMessage
或PeekMessage
function。
在你的WndProc
例程中, DefWindowProc
函数负责这些消息的默认行为。 WM_CLOSE消息请求应用程序应该closures,默认行为是调用DestroyWindow
函数。 它的这个DestroyWindow
函数被调用时发送WM_DESTROY消息。 请注意, WM_CLOSE只是一个请求closures的消息(如WM_QUIT ) – 实际上并不需要退出/退出。 但WM_DESTROY消息告诉你,你的窗口被closures和销毁,所以你必须清理任何资源,处理等
首先让我们来讨论一下WM_QUIT–与另一个与窗口没有关联的消息的区别。 它被应用程序使用。 例如,这可以通过不可见的独立OLE服务器(.exe,但不是以proc作为.dll)
WM_CLOSE – 每msdn:“ 一个应用程序可以提示用户确认,在销毁窗口之前 ” – 它被用作关于意图closures的通知(您可以拒绝这个意图)。
WM_DESTROY – 事实上,窗口正在closures,所有的资源必须(!)被释放。
就这样,它不会在评论中迷失…不要忘记WM_CANCEL
。 当您单击MFC对话框上的closures(x)button时,它肯定会发送WM_CLOSE
。 默认的OnClose()
函数将调用默认的(基类) OnCancel()
函数。
但是,如果你只是简单地键入ESC
键,这将导致closures对话框,但是(据我所知),而不产生WM_CLOSE
事件 – 它直接到WM_CANCEL/OnCancel()
机制。
我现在请社区详细说明这个问题,或者把这个阐述编辑成可接受的答案。