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

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

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

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

например Возможно, особая последовательность ответов на такие сообщения, как WM_SIZE, может подавить это? Я не знаю.

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


person user541686    schedule 05.07.2012    source источник
comment
Сама Windows в качестве оптимизации перерисовывает предыдущее содержимое экрана, а затем позволяет вашей программе правильно перерисовывать окно. Я не уверен, что вы можете сделать с автоматической частью процесса.   -  person Mark Ransom    schedule 06.07.2012
comment
@MarkRansom: даже для неклиентской области? Проблема не только в клиентской области.   -  person user541686    schedule 06.07.2012
comment
Вы также можете посмотреть на stackoverflow.com/a/5739620/5987 мое собственное решение проблемы изменения размера.   -  person Mark Ransom    schedule 06.07.2012
comment
@MarkRansom: Спасибо, посмотрю.   -  person user541686    schedule 06.07.2012
comment
Кажется, я помню, что у меня были проблемы с этим на XP с включенными темами. Если я перетащу левую границу окна, правая граница будет колебаться. Однако колебания не происходили в более ранних версиях Windows или Windows 7. И я думаю, что это было нормально в XP с классическим внешним видом, потому что в конце концов я пришел к выводу, что это ошибка в механизме тем XP.   -  person arx    schedule 06.07.2012


Ответы (2)


Ответьте на сообщение WM_WINDOWPOSCHANGING и установите флаг SWP_NOCOPYBITS в элементе flags структуры WINDOWPOS.

person Mark Ransom    schedule 05.07.2012
comment
Разве это не влияет только на клиентскую область? - person user541686; 06.07.2012
comment
@Mehrdad, я думаю, ты прав. Однако я не заметил никаких проблем, не связанных с клиентом, по крайней мере, в Windows 7. - person Mark Ransom; 06.07.2012
comment
Ооо, я только что заметил... да, неклиентская область копируется, а новая часть перерисовывается, но, вопреки тому, что я думал, она не перемещается! У меня возникла эта иллюзия, потому что клиентская область сдвинулась, ха-ха. Интересно, посмотрю получше, спасибо. - person user541686; 06.07.2012
comment
Да вроде намного лучше! Я все еще вижу небольшое стирание/закрашивание при перекрашивании, есть идеи, как от этого избавиться (или возможно ли это вообще)? - person user541686; 06.07.2012

Обновление 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)?

person Louis Semprini    schedule 26.10.2018