Избегайте мерцания в диалоге, который перемещает свои элементы управления при изменении размера - PullRequest
1 голос
/ 05 августа 2011

У меня есть всплывающее диалоговое окно (CDialog), которое обрабатывает сообщение WM_CTLCOLOR, чтобы окрасить себя.Он имеет некоторые элементы управления (например, кнопки растрового изображения), которые рисуют сами, используя OwnerDraw.Он также имеет элемент управления, отображающий изображение с размером, который занимает до 70% диалогового окна.

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

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

Поскольку для этого требуется некоторое усилие по кодированию, прежде чем идти по этому пути, мне нужноответы на следующие вопросы:

  • Будет ли это работать?
  • Если да, какова сложность этого метода?
  • Есть ли лучший способ?

Пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 05 августа 2011

Простые исправления:

  • создание медленного окна последним, чтобы оно не задерживало рисование простых элементов управления
  • Включение флага стиля WS_EX_COMPOSITED, чтобы Windows делала двойную буферизацию всего окна, включая его дочерние элементы. Остерегайтесь покрасочных артефактов
  • отключение флага стиля WS_CLIPCHILDREN, чтобы отверстия не были так заметны. Если сделать фон белым, то получится то же самое
  • упрощение рисования медленных элементов управления между WM_ENTERSIZEMOVE и WM_EXITSIZEMOVE
  • при использовании меньшего количества элементов управления ненужное прожигание дорогого окна на простой строке или изображении
2 голосов
/ 05 августа 2011

Вероятно, это будет работать, но вам следует попробовать решения, которые раньше не изменяли вашу иерархию управления, потому что это имеет другие тонкие последствия (фокус, порядок табуляции, уведомления о сообщениях и т. Д.).

Попробуйте выполнить одно или все из следующих действий:

  • Используйте функции BeginDeferWindowPos / DeferWindowPos / EndDeferWindowPos для перемещения дочерних элементов.
  • Установите флаг стиля WS_CLIPCHILDREN в диалоговом окне.
  • Установите флаг расширенного стиля WS_EX_LAYERED в диалоговом окне.
...