【问题标题】:When does Windows stops sending WM_PAINT messages?Windows 何时停止发送 WM_PAINT 消息?
【发布时间】:2015-06-13 03:37:02
【问题描述】:

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

这对吗?

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

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    如果我没有验证矩形,Windows 怎么知道要等到我完成 WM_PAINT 事件处理后再发送新的 WM_PAINT 消息?

    您通过调用BeginPaint,然后绘画,然后调用EndPaint 来处理WM_PAINT。当您调用EndPaint 时,您绘制的区域被标记为有效。

    ...而不是在我从消息队列中取出 WM_PAINT 消息后直接发送新的 WM_PAINT 消息?

    当您处理消息队列时,Windows 会生成WM_PAINT 消息。只有在存在无效区域时才会生成WM_PAINT 消息。绘制完成后,将不再有无效区域,因此不会生成 WM_PAINT 消息。

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

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

    当系统或其他应用程序请求绘制应用程序窗口的一部分时发送 WM_PAINT 消息。该消息在调用 UpdateWindow 或 RedrawWindow 函数时发送,或者在应用程序使用 GetMessage 或 PeekMessage 函数获取 WM_PAINT 消息时由 DispatchMessage 函数发送。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 2019-10-28
      • 1970-01-01
      相关资源
      最近更新 更多