如果我窗口上的指定矩形无效(即需要绘制),则会在消息队列中发布WM_PAINT
消息,如果我没有验证WM_PAINT
中的矩形事件处理程序,然后将新的WM_PAINT
消息发布到消息队列。
这是对的吗?
如果它是正确的,那么Windows如何知道不继续发送WM_PAINT
消息,我的意思是Windows知道如何等到我完成处理WM_PAINT
事件然后发送新事件如果我没有验证矩形,那么WM_PAINT
消息,并且在我从消息队列中出列WM_PAINT
消息后不直接发送新的WM_PAINT
消息?
答案 0 :(得分:2)
Windows如何知道等到我完成处理WM_PAINT事件,然后在我没有验证矩形的情况下发送新的WM_PAINT消息?
您可以通过调用WM_PAINT
,然后绘画,然后调用BeginPaint
来处理EndPaint
。当您拨打EndPaint
时,您绘制的区域会被标记为有效。
...并且在我从消息队列中取消WM_PAINT消息后不直接发送新的WM_PAINT消息?
Windows处理邮件队列时会生成WM_PAINT
条消息。只有无效区域时,它才会生成WM_PAINT
条消息。绘制完成后,不再有无效区域,因此不会生成WM_PAINT
条消息。
请注意,Windows通常不会发送 WM_PAINT
消息。这些是在应用程序的消息循环从消息队列中提取消息时检索的异步消息。例如,当您调用GetMessage
并且消息队列为空,并且存在无效区域时,则会生成WM_PAINT
条消息。
上述声明的例外情况是对UpdateWindow
和RedrawWindow
的调用。在这些情况下,WM_PAINT
消息将同步发送。来自documentation:
当系统或其他应用程序请求绘制应用程序窗口的一部分时,将发送WM_PAINT消息。调用UpdateWindow或RedrawWindow函数时发送消息,或者当应用程序使用GetMessage或PeekMessage函数获取WM_PAINT消息时,通过DispatchMessage函数发送消息。