【发布时间】:2015-09-03 20:01:54
【问题描述】:
如果我在父窗口上调用InvalidateRect(),例如:
InvalidateRect(hWnd, NULL, TRUE);
会发生什么,在WM_PAINT 处理程序中,BeginPaint() 将发送一个WM_ERASEBKGND 消息,这将清除背景,因此所有子控件都将消失。
但是当我调用InvalidateRect() 时,子控件仍然存在,这是否意味着InvalidateRect() 也会向子控件发送WM_PAINT 消息?
【问题讨论】:
-
@David Heffernan 但是如何重新绘制子控件?我的意思是如果没有
WM_PAINT消息发送给他们。 -
首先,让我们明确一点,绘画是异步的。你打电话给
InvalidateRect,并没有立即发生任何事情。只有当消息队列被清空时,才会重新绘制无效区域。至于子控件,它很复杂。 DWM 组合意味着控件可能不需要重新绘制。 DWM 系统可能已经拥有了它所需要的一切,并且没有任何理由去采取另一个WM_PAINT。因此,它的行为方式可能取决于组合或双缓冲是否处于活动状态。