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

时间:2013-05-25 11:41:30

标签: c++ windows winapi

在我的演示应用程序中

case WM_CLOSE:
    DestroyWindow(hndl);
    return 0;

case WM_CLOSE:
    PostQuitMessage(0);
    return 0;

做同样的事。在给每个人打电话时窗帘背后有什么不同? DestroyWindow更直接,PostQuitMessage必须通过getmessage循环返回false吗?

3 个答案:

答案 0 :(得分:15)

DestroyWindow销毁该窗口(惊喜)并将WM_DESTROY(您还会得到WM_NCDESTROY)发布到消息队列中。这是WM_CLOSE的默认行为。但是,仅仅因为窗口被销毁并不意味着消息循环应该结束。这可能是因为具有在关闭时结束应用程序的特定窗口以及在关闭时对应用程序不执行任何操作的其他窗口(例如,选项页面)。

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

答案 1 :(得分:14)

两个片段都不正确。第一个将执行默认窗口过程在处理WM_CLOSE消息时已经执行的操作,因此是多余的。但是不会让应用程序退出,它应该继续运行,你通常必须通过Debug + Stop Debugging强制调试器停止。如果你在没有调试器的情况下运行它,那么你将保持进程运行但没有窗口,所以你不能告诉它仍在运行。使用Taskmgr.exe,Processes选项卡查看那些僵尸进程。

第二个代码段将终止应用程序,但由于您未将WM_CLOSE消息传递给默认窗口过程,因此无法正常清理。窗户不会被破坏。虽然操作系统会为你清理,但它确实都会有一个好的结局,只是没有任何优点的奖励点。

正确的方法是在主窗口被销毁时退出。您将从发生这种情况时发送的WM_DESTROY通知中了解它:

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;

答案 2 :(得分:0)

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

作为旁注,如果你需要在消息循环之后执行更多行代码(例如进一步清理),PostQuitMessage是一种更好的方法,因为DestroyWindow会在不通过消息循环的情况下销毁窗口,忽略消息循环后剩余的任何清理代码。有些人可能称之为不太好的编码习惯,但有时你无法避免这种情况。