子視窗更新區域
子視窗是具有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樣式之視窗的更新和可見區域不會受到其父窗口的影響。