我正在尝试理解WTL的工作方式,消息循环现在让我感到困惑。
例如下面的代码片段:link
首先创建窗口,然后启动消息泵。它是怎么工作的?CreateEx、UpdateWindow等不是应该像WM_CREATE/WM_PAINT/WM_NCPAINT那样发送自己的不可见消息吗?如果消息泵未初始化,它们会被抛到哪里?如果你创建了一个窗口,启动了消息循环,然后关闭了窗口,但是想要在原来的位置创建一个新的窗口,会发生什么呢?PostQuit退出循环,而您必须创建一个新的循环?
发布于 2011-03-01 23:46:25
理解发布消息(PostMessage)和发送消息(SendMessage)之间的区别在这里很重要。Windows直接为发送的消息调用窗口过程,它们不是由消息循环调度的。这就是在消息循环开始之前处理WM_CREATE和WM_SHOWWINDOW的方式。WM_QUIT、WM_PAINT、WM_KEYDOWN和WM_MOUSEMOVE是发布的消息的示例。
发布于 2011-03-01 23:04:50
对于消息发送,CreateWindow直接发送消息,就好像使用了SendMessage一样。如果您进行过大量的Windows编程,那么您可能已经以这种方式直接向控件发送消息,并且无需运行消息泵即可立即执行操作;Windows本身也会执行此操作。
对于PostQuitMessage问题,通常的策略是在消息循环中进行一些其他检查,以查看应用程序是否应该退出。例如,不是在窗口关闭时发布退出消息并在消息循环中等待WM_QUIT,您可以维护一个打开窗口的计数器,然后在没有打开窗口的情况下退出。
WM_QUIT没有什么神奇之处,除了可以方便地使用PostQuitMessage发布它,并使用GetMessage (等)轻松检查它。函数。你可以不使用它,也可以出于其他原因决定退出你的程序。
https://stackoverflow.com/questions/5156026
复制相似问题