2009-09-30 4 views
2

У меня есть простое приложение для Windows здесь:DWM Состав тумблер вызывает область клиента потерять альфа

http://www.bengoodger.com/software/chrome/dwm/app.cc

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

«Подгонянная стеклянная рамка» состоит из увеличенной области заголовка заголовка, о которой сообщается в моей реализации WM _ NCCALCSIZE, чтобы быть частью клиентской области, так как я хотел бы визуализировать в нее прозрачные элементы управления. Так что эта область «высокая область заголовка» моего окна прозрачна, я заполняю ее прозрачным черным (BLACK_BRUSH в простом примере выше), что заставляет его рисовать как стекло с помощью DWM.

Когда система DWM переключается, например. используя панель управления «Параметры внешнего вида», чтобы переключиться на Vista Basic или Windows Standard или когда приложение, требующее отключения системы DWM, мое приложение переключается на полностью настраиваемый режим рендеринга, обрабатывая WM_NCPAINT и т. д. Когда я переключаюсь обратно, я бы ожидайте обратное, что в основном происходит, за исключением того, что моя «высокая область заголовка заголовка» теперь сплошная черная.

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

Мой вопрос: что я здесь делаю неправильно? Кажется, что окно каким-то образом помещается в фиктивное состояние, и скрытие/показ его исправляет его. Как я могу предотвратить это? Любое руководство будет высоко оценено.

Примечание: Я немного сузил это. Когда стекло DWM действует, любая часть области клиента, окрашенная в черный цвет, которая отображается над клиентской областью, становится прозрачной. Мы заметили, что при возврате в Glass из не-стекла область клиента становится сплошной черной, а не прозрачной. Однако, когда окно максимизируется и затем восстанавливается, окно возвращается к прозрачности. Когда я затем перетаскиваю размер, окно меньше, окно верхней части остается прозрачным. Когда я перетаскиваю его больше, верхняя часть окна снова становится черной. Это похоже на то, что DWM кэширует пиксели за окном, и размер окна больше, потому что он не может ничего рисовать, потому что его кеш недостаточно велик. Кажется, я не могу найти функцию DWM для сброса этого состояния. Кажется, что Maximize/Minimize, Restore или SetWindowPlacement способны щекотать его, но имеют другие нежелательные побочные эффекты.

ответ

2

http://www.codeproject.com/KB/dialog/rtaGlassEffectLib.aspx

Как вы уже заметили, GlassEnabled свойства является отличной один для тестирования, если эта функция включена в вашей системе, а затем начать использовать нашей библиотеки и вызовите ShowEffect() чтобы показать эффект стекла, теперь предположим, что пользователь отключил/включил Aero Theme, пока ваша заявка бежала! Это может вызвать проблему при появлении приложения .

Чтобы решить эту проблему, два события были добавлены в библиотеку, чтобы следить за изменений, происходящих в системе в то время как ваше приложение работает, эти два события GlassEffectEnabled событие и GlassEffectDisabled.

Теперь для тех, кто любит, чтобы знать, как работает материал .. Я могу сказать, что эти события были реализованы путем мониторинга сообщения, поступающие из системы окна в наше приложение ищет для WM_SYSCOLORCHANGE сообщения этого указывает, что цвета системы имеют . Итак, сделав быстрый , сравните состояние GlassEnabled до и после это сообщение, мы можем решить, включена ли эта функция или нет.

 Смежные вопросы

  • Нет связанных вопросов^_^