Можно ли сделать фигурный диалог с альфа-смешением?

Я делаю непрямоугольный диалог, смоделированный по изображению из Photoshop (изображение является фоном диалога, и пользователь будет видеть через прозрачную часть изображения). Мне нравится окно в стиле приборной панели для мультимедийного приложения с несколькими пользовательскими элементами управления. Большая часть фонового изображения либо непрозрачна, либо на 100% прозрачна, но между ними есть тонкая область частично прозрачных пикселей, предназначенная для плавного слияния изображения с фоном. Это прекрасно работает для веб-графики, но я не нашел способа заставить это работать для окон Windows. Я использую библиотеку шаблонов Windows (WTL), msvc 2008, и приложение должно работать в Windows XP, а также в Vista и Windows 7.

В настоящее время я просто использую непрозрачную часть фонового изображения для создания области отсечения GDI, но это дает довольно грубые края.

Кто-нибудь знает о каких-либо функциях API для этого (часть WTL или доступная из WTL)?


person jgaa    schedule 19.05.2010    source источник


Ответы (3)


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

person Ron Warholic    schedule 19.05.2010
comment
Я пробовал многослойные окна со стилем WS_EX_LAYERED в другом проекте, и оказалось, что я могу затухать окно, но попиксельное смешивание работает логическим способом. Каждый пиксель был либо виден, либо нет. Direct2D может работать, но, к сожалению, он недоступен для Windows XP. - person jgaa; 20.05.2010
comment
Раньше я без проблем использовал многослойные окна, чтобы создать форму с альфа-смешением (затенением). У Алена есть ссылка на использование WTL с многоуровневым стилем окна, проверьте это. - person Ron Warholic; 20.05.2010

Не уверен, как это взаимодействует с WTL, но взгляните на AlphaBlend. Вам нужно будет выбрать свое частично прозрачное растровое изображение в DC и скопировать его в DC вашего диалога в вашей функции рисования.

person Mark Ransom    schedule 19.05.2010
comment
AlphaBlend() отлично работает с WTL, но я не могу прозрачно смешаться с фоном моего окна приложения. - person jgaa; 20.05.2010

В этой статье показано, как использовать многоуровневые окна с WTL и API Gdi+. который доступен на всех ваших целевых платформах.

person Alain Rist    schedule 19.05.2010