【问题标题】:Windows message loops and WTLWindows 消息循环和 WTL
【发布时间】:2011-07-06 13:49:00
【问题描述】:

我正在尝试了解 WTL 的工作方式,而消息循环现在让我感到困惑。

例如这个代码片段:link

首先创建窗口,然后启动消息泵。它是如何工作的? CreateEx、UpdateWindow 等不应该发送自己的不可见消息,如 WM_CREATE/WM_PAINT/WM_NCPAINT?如果消息泵未初始化,它们会被扔到哪里?如果你创建一个窗口,启动消息循环,然后关闭窗口,但又想在它的位置创建一个新窗口,会发生什么? PostQuit 退出循环,你必须创建一个新的?

【问题讨论】:

    标签: c++ windows winapi wtl


    【解决方案1】:

    了解发布消息 (PostMessage) 和发送消息 (SendMessage) 之间的区别在这里很重要。 Windows 直接为发送的消息调用窗口过程,它们不是由消息循环调度的。这是在消息循环开始之前如何处理 WM_CREATE 和 WM_SHOWWINDOW 的。 WM_QUIT、WM_PAINT、WM_KEYDOWN 和 WM_MOUSEMOVE 是发布消息的示例。

    【讨论】:

    • 那么在这种情况下基本上所有发布的消息都丢失了?而且你最好从消息循环中创建窗口?
    • 不,它们存储在消息队列中。您不能在消息循环中创建主窗口,鸡和蛋。如果你想做这种编程,Petzold 是必读的。
    • 好的,我今天去订书。但是是什么让主窗口如此特别?您可以启动循环,并将“单例”初始化消息发布到线程以创建窗口,这样就可以了,不是吗?
    • 不太清楚为什么以非标准方式执行此操作对您如此重要。 PostThreadMessage 相当邪恶。阅读本书。
    • 我只是想了解内部原理以及如何正确解决问题。从消息循环“直观地”创建窗口似乎更正确。但整个事情仍然令人困惑。更不用说 MessageBoxW 吃掉消息循环的所有疯狂案例了。
    【解决方案2】:

    关于消息发送,CreateWindow 直接发送消息,好像使用了SendMessage。如果你做过很多 Windows 编程,你可能已经通过这种方式直接向控件发送消息,并且不需要消息泵运行就可以立即发生事情; Windows 自己也会这样做。

    对于PostQuitMessage 问题,通常的策略是在消息循环中进行一些其他检查,以查看应用程序是否应该退出。例如,与其在窗口关闭时发布退出消息并在消息循环中等待WM_QUIT,不如维护一个打开窗口的计数器,然后在有 0 个打开的窗口时退出。

    WM_QUIT 没有什么神奇之处,除了您可以使用PostQuitMessage 发布它并使用GetMessage (等)功能轻松检查它的便捷方式。您可以不使用它并出于其他原因决定退出您的程序。

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 2014-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      相关资源
      最近更新 更多