Прочитать на английском

Поделиться через


Регион обновления дочернего окна

Дочернее окно — это окно с стилем 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), то окна с братом получают WM_PAINT сообщения в обратном порядке их позиции в порядке Z. Учитывая это, окно в порядке Z (в верхней части) получает свое WM_PAINT сообщение последний и наоборот. Если окно в родительской цепочке не композитно, одноуровневые окна получают WM_PAINT сообщения в порядке Z.

Одноуровневые окна не обрезаются автоматически. Один брат может нарисовать другой перекрывающийся брат, даже если окно, нарисовающее рисунок, имеет более низкую позицию в порядке Z. Приложение может предотвратить это, указав стиль WS_CLIPSIBLINGS при создании окон. Если этот стиль задан, система исключает все части перекрывающегося окна с братом из видимого региона окна, если перекрывающийся окну имеет более высокую позицию в порядке Z.

Примечание

Обновление и видимые регионы для окон с WS_POPUP или WS_POPUPWINDOW стилем не влияют на родительские окна.