InvalidateRect()是否向子控件发送WM_PAINT消息?

时间:2015-09-03 08:51:35

标签: c winapi

如果我在父窗口上调用ArrayAdapter,例如:

InvalidateRect()

InvalidateRect(hWnd, NULL, TRUE); 处理程序中,WM_PAINT将发送BeginPaint()消息,这将删除背景,因此所有子控件都将消失。

但是当我拨打WM_ERASEBKGND时,子控件仍然存在,那么这是否意味着InvalidateRect()也会向子控件发送InvalidateRect()消息?

1 个答案:

答案 0 :(得分:0)

  

InvalidateRect()是否将WM_PAINT消息发送给子控件?

是(大多数情况下),这里有清楚的描述:

https://msdn.microsoft.com/en-us/library/windows/desktop/dd183426(v=vs.85).aspx

  

只要父窗口的更新区域的一部分包含子窗口的一部分,系统就会为子窗口设置更新区域。在这种情况下,系统首先将WM_PAINT消息发送到父窗口,然后向子窗口发送消息,允许子项恢复父窗口可能已经绘制的窗口的任何部分。

但有例外:

  

应用程序无法通过使完全位于子窗口下的父客户区的一部分无效来为子项生成WM_PAINT消息。在这种情况下,两个窗口都不会收到WM_PAINT消息。

知道

实际上很有趣

您可以通过将WS_CLIPCHILDREN设置为父窗口,或通过使用带有RDW_NOCHILDREN标志的RedrawWindow函数使重绘无效来阻止重绘子窗口。