子窗口更新区域

子窗口是具有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样式的窗口的更新和可见区域不受其父窗口的影响。