Как избежать переходных обновлений в графическом интерфейсе?

Если вы перетаскиваете верхнюю или левую границу окна полу-быстро, вы должны заметить, что противоположный край окна вибрирует - он перетаскивается, но затем повторно настраивается для увеличения размера.

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

Есть ли способ предотвратить эти переходные эффекты?

Например, возможно, определенная последовательность ответов на сообщения, такие как 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.

Как сгладить уродливый джиттер / мерцание / прыжок при изменении размеров окон, особенно перетаскивая левую / верхнюю границу (Win 7-10; bg, bitblt и DWM)?

Другие вопросы по тегам