Windows 什么时候停止发送 WM_PAINT 消息?

When does Windows stops sending WM_PAINT messages?

如果我的 Window 上指定的矩形无效(即需要绘制),则会将 WM_PAINT 消息发布到消息队列,如果我没有验证矩形WM_PAINT 事件处理程序,然后将新的 WM_PAINT 消息发布到消息队列。

这是正确的吗?

如果正确,那么Windows怎么知道不继续发送WM_PAINT消息,我的意思是Windows怎么知道等到我处理完WM_PAINT 事件,如果我没有验证矩形,然后发送一个新的 WM_PAINT 消息,并且在我从消息中取出 WM_PAINT 消息后不直接发送新的 WM_PAINT 消息排队?

How does Windows know to wait until I finish handling the WM_PAINT event and then send a new WM_PAINT message if I did not validate the rectangle?

您通过调用 BeginPaint,然后绘画,然后调用 EndPaint 来处理 WM_PAINT。当您调用 EndPaint.

时,您绘制的区域被标记为有效

... and not to send a new WM_PAINT message directly after I dequeue the WM_PAINT message from the message queue?

当您处理消息队列时,

Windows 生成 WM_PAINT 条消息。它只会在存在无效区域时生成 WM_PAINT 消息。绘制完成后,不再有无效区域,因此不会生成 WM_PAINT 消息。

请注意 Windows 通常不会 发送 WM_PAINT 消息。这些是当您的应用程序的消息循环从消息队列中拉取消息时检索到的异步消息。例如,当您调用 GetMessage 时,消息队列为空,并且存在无效区域,则生成 WM_PAINT 条消息。

上述语句的例外情况是调用 UpdateWindowRedrawWindow 时。在那些场景中,WM_PAINT 消息是同步发送的。来自 documentation:

The WM_PAINT message is sent when the system or another application makes a request to paint a portion of an application's window. The message is sent when the UpdateWindow or RedrawWindow function is called, or by the DispatchMessage function when the application obtains a WM_PAINT message by using the GetMessage or PeekMessage function.