2011-03-01 93 views
1

我想了解WTL的工作方式,现在消息循环令我困惑。Windows消息循环和WTL

例如此代码段:link

首次创建和该消息泵启动后的窗口。它是如何工作的?是不是CreateEx,UpdateWindow等应该发送像WM_CREATE/WM_PAINT/WM_NCPAINT自己的不可见消息?如果消息泵没有初始化,它们在哪里抛出?如果您创建窗口,启动消息循环,然后关闭窗口,但想要在其中创建一个新窗口,会发生什么? PostQuit退出循环,你必须创建一个新的?

回答

3

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

+0

那么基本上所有贴出的信息都会在这种情况下丢失?你最好从消息循环中创建窗口? – Coder 2011-03-01 15:56:16

+3

不,它们存储在消息队列中。您不能在消息循环中创建主窗口,鸡肉和鸡蛋。如果您想进行这种编程,Petzold需要阅读。 – 2011-03-01 16:06:17

+1

好的,我今天订购这本书。但是,主窗口如此特别的原因是什么?您可以启动循环,并将“singleton”初始化消息发布到线程以创建窗口,这可以做到这一点,不是吗? – Coder 2011-03-01 16:24:45

2

关于消息发送,CreateWindow直接发送消息,好像SendMessage被使用。如果你已经完成了很多Windows编程,你可能会直接以这种方式向消息发送消息,并且不需要消息泵即可立即执行; Windows也会自己做到这一点。

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

没有什么神奇的约WM_QUIT,除了可以用PostQuitMessage发布,并很容易地检查它与GetMessage(等)功能的便捷方式。你可以自由地不使用它,并决定退出你的程序出于某种其他原因。