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


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

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

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

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

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