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


Блокировка обновления окна

Блокировка обновления окна — это временная приостановка рисования в окне. Система использует блокировку для предотвращения рисования других окон по прямоугольнику отслеживания при каждом перемещении или размере окна. Приложения могут использовать блокировку, чтобы предотвратить рисование, если они выполняют аналогичные операции перемещения или изменения размера с собственными окнами.

Приложение использует функцию LockWindowUpdate, чтобы задать или очистить блокировку обновления окна, указав окно для блокировки. Блокировка применяется к указанному окну и всем дочерним окнам. При установке блокировки функцииGetDCи BeginPaint возвращают контекст устройства отображения с видимым регионом, пустым. Учитывая это, приложение может продолжать рисование в окне, но все выходные данные обрезаются. Блокировка сохраняется до тех пор, пока приложение не очистит его, вызвав LockWindowUpdate, указав NULL для окна. Хотя LockWindowUpdate заставляет видимый регион окна быть пустым, функция не делает указанное окно невидимым и не очищает бит стиля WS_VISIBLE.

После установки блокировки приложение может использовать функцию GetDCEx со значением DCX_LOCKWINDOWUPDATE, чтобы получить контекст устройства для рисования по заблокированным окнам. Это позволяет приложению нарисовать прямоугольник отслеживания при обработке сообщений с клавиатуры или мыши. Система использует этот метод при перемещении и размерах окон. GetDCEx извлекает контекст отображаемого устройства из кэша контекста отображаемого устройства, поэтому приложение должно освободить контекст устройства как можно скорее после рисования.

При настройке блокировки обновления окна система создает накопленный ограничивающий прямоугольник для каждого заблокированного окна. Когда блокировка очищается, система использует этот ограничивающий прямоугольник, чтобы задать область обновления для окна и ее дочерних окон, принудив к конечному WM_PAINT сообщению. Если накопленный ограничивающий прямоугольник пуст (то есть, если при настройке блокировки не произошло ни одного рисунка), область обновления не задана.