【发布时间】:2015-09-08 01:08:18
【问题描述】:
当窗口的一部分需要重新绘制时,该区域被标记为无效,当我重新绘制该区域时(在WM_PAINT事件处理程序中),我应该将该区域标记为有效。
但我不明白需要将该区域标记为无效然后再对其进行验证,我的意思是为什么不直接执行以下操作:当需要重新绘制区域时,只需发送 WM_PAINT 消息(不将该区域标记为无效),然后重新绘制该区域(不将其标记为有效)。
【问题讨论】:
当窗口的一部分需要重新绘制时,该区域被标记为无效,当我重新绘制该区域时(在WM_PAINT事件处理程序中),我应该将该区域标记为有效。
但我不明白需要将该区域标记为无效然后再对其进行验证,我的意思是为什么不直接执行以下操作:当需要重新绘制区域时,只需发送 WM_PAINT 消息(不将该区域标记为无效),然后重新绘制该区域(不将其标记为有效)。
【问题讨论】:
想象一下有人在栅栏上扔球。当球击中栅栏时,你会重新粉刷栅栏吗?不,当且仅当自上次重新粉刷后有球击中围栏时,您才重新粉刷围栏。
您建议任何时候将一个区域标记为无效,而是应向应用程序发送WM_PAINT 消息。这样做的最大问题是,如果同一区域多次失效,则会导致发送许多 WM_PAINT 消息,并且无法知道其中许多消息已被处理。因此,在您最需要高性能的时候(因为您在绘图方面落后),您必须一遍又一遍地重复相同的绘图操作。这没有意义。
【讨论】:
WM_PAINT 消息,不如只发送一条。这是正确的吗?
WM_PAINT 消息吗? (即消息队列为空时)
WM_PAINT 是一条低优先级消息,对InvalidateRect/InvalidateRgn 的多次调用被合并到一个更新区域中。