在本文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是排队消息,则应将其添加到消息队列中。 因此,在处理完当前消息和消息队列中的所有其他消息之前,它不会处理。这与上述声明有争议。
我想知道哪个是正确的,谢谢。
答案 0 :(得分:2)
任何消息都可以使用SendMessage
直接发送到窗口过程,或使用PostMessage
发布到窗口的消息队列中。 UpdateWindow
函数使用SendMessage
将WM_PAINT
消息直接发送到窗口过程,以便立即重新绘制窗口。当系统因任何原因需要重绘窗口时,它通常会将消息发布到窗口的消息队列中。
因此WM_PAINT
不是排队(已发布)的消息,也不是发送的消息。这只是一条信息。它可以发送或发布。有些邮件只是发送或发布,但WM_PAINT
不是其中之一。
答案 1 :(得分:1)
以下是MSDN
中有关UpdateWindow函数的文档UpdateWindow函数更新指定的客户区 窗口的窗口通过向窗口发送WM_PAINT消息 更新区域不为空。该函数发送WM_PAINT消息 直接到指定窗口的窗口过程,绕过 应用程序队列。如果更新区域为空,则不显示任何消息 发送。