WM_PAINT消息是排队消息还是非排队消息?

时间:2014-09-07 17:56:54

标签: windows winapi

在本文About Messages and Message Queues中,有人说WM_PAINT是一种排队消息。

排队的消息

  

每当用户移动鼠标时,单击鼠标按钮或类型   在键盘上,鼠标或键盘的设备驱动程序转换   输入到消息中并将它们放在系统消息队列中。   系统从系统中一次删除一条消息   消息队列,检查它们以确定目标窗口,以及   然后将它们发布到创建该线程的线程的消息队列中   目的地窗口。线程的消息队列接收所有鼠标和   线程创建的窗口的键盘消息。线程   从队列中删除消息并指示系统将其发送到   适当的窗口程序进行处理。

     

除WM_PAINT消息,WM_TIMER消息和WM_QUIT消息外,   系统始终在消息队列的末尾发布消息。这个   确保窗口首先接收其输入消息   in,first out(FIFO)序列。 WM_PAINT消息,WM_TIMER   但是,WM_QUIT消息保留在队列中   仅当队列包含否时才转发到窗口过程   其他消息。另外,多个WM_PAINT消息相同   窗口被合并为一个WM_PAINT消息,整合所有   客户区的无效部分分为单个区域。结合   WM_PAINT消息减少了窗口必须重绘的次数   客户区的内容。

但根据“编程窗口”一书

  

但是,窗口过程可以调用发送的函数   窗口过程另一条消息,在这种情况下是窗口过程   必须在函数调用之前完成处理第二条消息   返回,此时窗口过程继续进行原始操作   信息。例如,当窗口过程调用UpdateWindow时,   Windows使用WM_PAINT消息调用窗口过程。当。。。的时候   窗口过程完成处理WM_PAINT消息,   UpdateWindowcall将控件返回到窗口过程。

如果WM_PAINT是排队消息,则应将其添加到消息队列中。 因此,在处理完当前消息和消息队列中的所有其他消息之前,它不会处理。这与上述声明有争议。

我想知道哪个是正确的,谢谢。

2 个答案:

答案 0 :(得分:2)

任何消息都可以使用SendMessage直接发送到窗口过程,或使用PostMessage发布到窗口的消息队列中。 UpdateWindow函数使用SendMessageWM_PAINT消息直接发送到窗口过程,以便立即重新绘制窗口。当系统因任何原因需要重绘窗口时,它通常会将消息发布到窗口的消息队列中。

因此WM_PAINT不是排队(已发布)的消息,也不是发送的消息。这只是一条信息。它可以发送或发布。有些邮件只是发送或发布,但WM_PAINT不是其中之一。

答案 1 :(得分:1)

以下是MSDN

中有关UpdateWindow函数的文档
  

UpdateWindow函数更新指定的客户区   窗口的窗口通过向窗口发送WM_PAINT消息   更新区域不为空。该函数发送WM_PAINT消息   直接到指定窗口的窗口过程,绕过   应用程序队列。如果更新区域为空,则不显示任何消息   发送。