子窗口更新区域

子窗口是具有WS_CHILD或WS_CHILDWINDOW样式的窗口。 与其他窗口样式一样,子窗口接收 WM_PAINT 消息以提示更新。 每个子窗口都有一个更新区域,系统或应用程序可以设置为生成最终 WM_PAINT 消息。

子窗口的更新和可见区域受子窗口的父窗口的影响;对于其他样式的窗口,这并不真实。 当系统设置父窗口的更新区域时,系统通常会设置子窗口的更新区域,导致子窗口在父窗口收到消息时接收 WM_PAINT 消息。 系统将子窗口可见区域的位置限制在父窗口的工作区内,并剪裁子窗口在父窗口外移动的任何部分。

每当父窗口的更新区域的一部分包含子窗口的一部分时,系统设置子窗口的更新区域。 在这种情况下,系统首先将 WM_PAINT 消息发送到父窗口,然后将消息发送到子窗口,使子窗口能够还原父级可能已绘制的窗口的任何部分。

设置子级时,系统不会设置父级的更新区域。 应用程序无法通过使子窗口失效为父窗口生成 WM_PAINT 消息。 同样,应用程序无法通过使完全位于子窗口下的父工作区的一部分失效来为子级生成 WM_PAINT 消息。 在这种情况下,两个窗口都不会收到 WM_PAINT 消息。

应用程序可以通过在创建父窗口时指定WS_CLIPCHILDREN样式来阻止设置子窗口的更新区域。 设置此样式后,系统会从父可见区域中排除子窗口,因此忽略可能包含子窗口的更新区域的任何部分。 当应用程序在父窗口中绘制时,任何将覆盖子窗口的绘图都会被剪裁,从而使后续 WM_PAINT 消息不必要地传递给子窗口。

子窗口的更新和可见区域也受子窗口的同级影响。 同级窗口是具有公共父窗口的任何窗口。 如果同级窗口重叠,则为一个窗口设置更新区域会影响另一个区域的更新区域,从而导致 将WM_PAINT 消息发送到这两个窗口。 如果父链中的窗口 (具有WX_EX_COMPOSITED) 的窗口组合,则同级窗口按 Z 顺序接收 WM_PAINT 消息。 鉴于此情况,顶部) 的 Z 顺序 (窗口最高接收其 WM_PAINT 消息,反之亦然。 如果父链中的窗口未组合,同级窗口按 Z 顺序接收 WM_PAINT 消息。

同级窗口不会自动剪裁。 即使绘制的窗口在 Z 顺序中的位置较低,同级也可以绘制另一个重叠的同级。 应用程序可以通过在创建窗口时指定WS_CLIPSIBLINGS样式来阻止这种情况。 设置此样式后,如果重叠同级窗口在 Z 顺序中具有较高位置,则系统会从窗口的可见区域排除重叠同级窗口的所有部分。

注意

具有WS_POPUP或WS_POPUPWINDOW样式的窗口的更新和可见区域不受其父窗口的影响。