无效和有效区域

时间:2013-12-14 18:35:37

标签: windows winapi gdi

在参考Windows GDI时,无效区域和有效区域之间有什么区别?我理解,对InvalidateRect()的调用会向队列发送WM_PAINT消息,但究竟什么是“无效”区域?

2 个答案:

答案 0 :(得分:3)

  

据我所知,对InvalidateRect()的调用会向队列发送WM_PAINT消息。

嗯,不完全是。当您致电InvalidateRect时,您将该矩形区域标记为无效并需要重新绘制。但是没有发送消息。实际上,甚至没有消息发布到队列中。

当您调用GetMessage或其中一个等价物时,如果队列为空,并且线程中有窗口有脏区域,则系统会合成WM_PAINT消息。从WM_PAINT返回此合成的GetMessage消息。然后,WM_PAINT的窗口处理程序应该绘制窗口,从而使其再次有效。

因此,无效区域是待绘画的区域。您已告知系统您希望重新绘制该区域,并且系统将安排在处理优先级较高的排队消息后进行该操作。

答案 1 :(得分:1)

除非必要,否则窗口系统通常会试图避免重绘任何内容,例如因为某些东西已经改变,或者另一个窗口已经移动了。发生这种情况时,它会将该区域标记为无效,表示需要重新绘制该区域。或者,可以手动使区域/窗口无效以强制重绘。

当应用程序响应WM_PAINT消息时,它将尝试通过仅重绘无效区域来尽可能高效。完成后,它标记为有效,表明它现在是最新的。

这种选择性重绘方法今天并不像以前那么重要。在过去,绘图操作要慢得多,因此优化是绝对必要的。