Стекло Windows Vista / 7 полностью разбито? - PullRequest
1 голос
/ 06 декабря 2010

Я пытаюсь получить эффект стекла медиаплеера для приложения, но все время сталкиваюсь с препятствиями. Это я или API?

Я начал с звонка:

MARGINS margins = { -1, -1, -1, -1 };
HRESULT result = ::DwmExtendFrameIntoClientArea(m_hWnd, &margins);

И стирание фона на черном:

OnEraseBkgnd

Все было хорошо, пока я не добавил поле для редактирования. С EditBox места, где появляется черный текст, заменяются на стекло. Проблема раздута с более продвинутыми элементами управления, такими как ComboBoxEx и тому подобное. Те начинают выглядеть как беспорядок.

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

Решением для блоков редактирования, по-видимому, является использование WS_EX_LAYERED с LWA_COLORKEY, использование какого-то ужасного цвета для маскировки стекла и стирание фона до этого цвета. К сожалению, это ломает другие вещи. Альфа-смешивание на значках выглядит безобразно с тенями, смешанными с радиоактивным зеленым, и само стекло становится пригодным для щелчка, даже если у меня нет стиля WS_EX_TRANSPARENT в окне.

Третье предложение - это своего рода композиция с GDI +, но это кажется плохим подходом, поскольку GDI + - это запасной вариант программного обеспечения, и я не могу найти способ визуализации EditBox или ComboBoxEx в изображение, которое я мог бы использовать для композиции позже.

Я что-то упустил?

Источники в SO также, похоже, сталкиваются с такими же проблемами: link1 link2

Ответы [ 3 ]

3 голосов
/ 06 декабря 2010

Кенни Керр (Kenny Kerr) написал отличную статью об отображении элементов управления на стекле, используя в качестве примера элементы редактирования:

http://weblogs.asp.net/kennykerr/archive/2007/01/23/controls-and-the-desktop-window-manager.aspx

2 голосов
/ 07 декабря 2010

Простой ответ: вы не можете сделать это.

Все стандартные элементы управления отображаются при обычных вызовах GDI.Обычные вызовы GDI не знают альфа и в большинстве случаев устанавливают нулевой альфа-канал.

Более сложный ответ: вы можете: Есть несколько примеров в сети, где стандартные элементы управления смешаны с аэростеклом.Они делятся на две основные категории:

  • Образцы WinForms (.NET).WinForms на самом деле не используют нативные элементы управления - все элементы управления WinForms являются переписанными версиями, которые, помимо других функций, блефуют с помощью подпрограмм, поддерживающих альфа.Этот пример удручающе прост и заставляет меня понять, насколько сильно Microsoft ненавидит собственных разработчиков.

  • Примеры подклассов: единственный способ заставить обычные / собственные элементы управления рисоватьaero glass предназначен для создания подклассов элементов управления, перехвата сообщений WM_PAINT для создания DIBBitmap, вызова WM_PRINT для рендеринга содержимого элементов управления на него.Используйте функции DWM для восстановления данных альфа-канала.Нарисуйте получившийся альфа-код самостоятельно, используя AlphaBlend.

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

0 голосов
/ 06 декабря 2010

Попробуйте изменить цвет текста / переднего плана на элементах управления, таких как поле редактирования, на что-нибудь «почти черное» (например, # 010101). Тогда вы сможете пропустить другие проблемы рендеринга, кроме альфа-прозрачности для изображений / значков.

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

...