PostQuitMessage()和DestroyWindow()之间的逻辑区别是什么?

在我的演示有点应用程序

case WM_CLOSE: DestroyWindow(hndl); return 0; 

 case WM_CLOSE: PostQuitMessage(0); return 0; 

照着做。 每次打电话时,窗帘背后有什么不同? DestroyWindow更直接,PostQuitMessage必须通过getmessage循环返回false?

Solutions Collecting From Web of "PostQuitMessage()和DestroyWindow()之间的逻辑区别是什么?"

DestroyWindow破坏窗口(惊喜),并将一个WM_DESTROY (你也将得到一个WM_NCDESTROY )消息队列。 这是WM_CLOSE的默认行为。 但是,仅仅因为一个窗口被销毁并不意味着消息循环应该结束。 这可以是具有特定窗口的情况,该特定窗口在关闭时结束应用程序,而在关闭时(例如,选项页面)对应用程序没有任何作用。

PostQuitMessageWM_QUIT到消息队列,通常会导致消息循环结束。 例如, GetMessage在将WM_QUIT拉出时将返回0。 这通常会在主窗口的WM_DESTROY处理程序中调用。 这不是默认行为; 你必须自己做。

这两个片断都不是正确的。 第一个处理WM_CLOSE消息的时候,默认的窗口过程已经完成了,所以是多余的。 但是,如果不以其他方式使应用程序退出,应该继续运行,并且通常必须强制调试器停止使用“调试+停止调试”。 如果你在没有调试器的情况下运行它,那么你将离开这个进程运行,但没有一个窗口,所以你不能说它仍然在运行。 使用Taskmgr.exe,进程选项卡查看这些僵尸进程。

第二个片段将终止应用程序,但不会正确清理,因为您不会将WM_CLOSE消息传递给默认的窗口过程。 窗户不会被毁坏。 尽管操作系统会为你清理,所以这一切都达到了一个好的结局,没有任何优雅的奖励点。

当你的主窗口被破坏时,正确的方法是退出。 当发生WM_DESTROY通知时,您将会知道该通知:

 case WM_DESTROY: PostQuitMessage(0); return 0; 

PostQuitMessage并不一定意味着应用程序的结束。 它只是将WM_QUIT发送到消息循环,并允许您退出消息循环,所以在大多数情况下,这意味着应用程序的结束。 但是,在多线程应用程序中,如果您创建了每个线程的消息循环,则PostQuitMessage只会关闭该线程。

作为一个方面说明,如果你在消息循环之后需要更多的代码行(比如进一步的清理),PostQuitMessage是一个更好的方法,因为DestroyWindow在不经过消息循环的情况下破坏了窗口,忽略了任何在消息循环之后剩余的清理代码。 有些人可能会说这是一个不太好的编码习惯,但有时你不能避免这样的情况。