Как избежать переходных обновлений в графическом интерфейсе?
Если вы перетаскиваете верхнюю или левую границу окна полу-быстро, вы должны заметить, что противоположный край окна вибрирует - он перетаскивается, но затем повторно настраивается для увеличения размера.
Проблема намного хуже, когда у вас есть элементы, которые динамически изменяют размер - тогда куча ваших элементов управления начинает скользить и изменять размеры на экране, что заметно.
Есть ли способ предотвратить эти переходные эффекты?
Например, возможно, определенная последовательность ответов на сообщения, такие как WM_SIZE
может подавить это? Я не знаю.
(Похоже, это происходит в каждом фреймворке, который я видел, даже в обычном Win32. Просто откройте проводник или что-то еще и перетащите его верхний или левый край, и вы поймете, что я имею в виду.)
2 ответа
Ответить на WM_WINDOWPOSCHANGING
сообщение и установить SWP_NOCOPYBITS
флаг в flags
член WINDOWPOS
состав.
Обновление 2018 года. WM_WINDOWPOSCHANGING
и связанные WM_NCCALCSIZE
Трюки, часто упоминаемые в SO, хорошо работали для XP/Vista/7, но их уже недостаточно для Win8/10, потому что Aero добавляет новый уровень проблем изменения размера, которые маскируют или ухудшают старые проблемы.
Проблему Win8/10 решить гораздо сложнее, потому что нежелательная копия ваших пикселей происходит в DWM.exe, еще одном процессе, который объединяет пиксели из всех приложений в системе.
Пожалуйста, смотрите этот раздел вопросов и ответов для объяснения того, что происходит, пример кода с WM_NCCALCSIZE
решить проблему на уровне XP/Vista/7 (который все еще существует в Win8/10!) и частичное решение для 8/10.