在参考Windows GDI时,无效区域和有效区域之间有什么区别?我理解,对InvalidateRect()
的调用会向队列发送WM_PAINT
消息,但究竟什么是“无效”区域?
答案 0 :(得分:3)
据我所知,对InvalidateRect()的调用会向队列发送WM_PAINT消息。
嗯,不完全是。当您致电InvalidateRect
时,您将该矩形区域标记为无效并需要重新绘制。但是没有发送消息。实际上,甚至没有消息发布到队列中。
当您调用GetMessage
或其中一个等价物时,如果队列为空,并且线程中有窗口有脏区域,则系统会合成WM_PAINT
消息。从WM_PAINT
返回此合成的GetMessage
消息。然后,WM_PAINT
的窗口处理程序应该绘制窗口,从而使其再次有效。
因此,无效区域是待绘画的区域。您已告知系统您希望重新绘制该区域,并且系统将安排在处理优先级较高的排队消息后进行该操作。
答案 1 :(得分:1)
当应用程序响应WM_PAINT
消息时,它将尝试通过仅重绘无效区域来尽可能高效。完成后,它标记为有效,表明它现在是最新的。
这种选择性重绘方法今天并不像以前那么重要。在过去,绘图操作要慢得多,因此优化是绝对必要的。