Области окна, движущиеся дочерние элементы, DWM и белый беспорядок, который он может создать - PullRequest
3 голосов
/ 11 июля 2011

Настройка: У меня есть окно верхнего уровня с определенной областью (созданной с помощью SetWindowRgn()), и у меня есть дочерний элемент, который перемещается (с помощью SetWindowPos()) так, что некоторые иззатем его пиксели перекрывают обрезанную часть области окна родителя.

Результат: Эти пиксели заполняются полностью непрозрачными, полностью белыми пикселями, вместо того, чтобы оставаться полностью прозрачными (так как он находится вне егорегион родителей).Дело не в том, что дочернее окно рисуется тогда, когда оно не должно, так как пиксели-нарушители имеют белый цвет независимо от того, как выглядит дочернее окно.

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

enter image description here

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

Это наблюдалось как в Vista, так и в 7. Это поведение исчезает, если я отключаю диспетчер окон рабочего стола (DWM).В одном случае он также исчез после обновления графических драйверов.Возможно, это связано с этой проблемой ?: Проблема живых миниатюр в Vista с SetWindowRgn .Первоначально я собирался просто подать это как редкую ошибку, но она появилась достаточно, чтобы заслуживать более тщательного изучения.

Кто-нибудь еще сталкивался с этим раньше?Любое понимание того, как области DWM и области окна взаимодействуют?

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

1 Ответ

1 голос
/ 13 июля 2011

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

HRGN hRgn = CreateRectRgn(0,0,0,0);
GetWindowRgn( hWnd, hRgn );
SetWindowRgn( hWnd, hRgn, true );
DeleteObject( hRgn );

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

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

...