2010-12-06 4 views
1

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

Я начал по телефону:

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

+0

Два вопроса, на которые вы ссылаетесь, кажутся почти точными дубликатами того, что вы просите здесь. Каков ваш вопрос: у кого-нибудь есть другие идеи? – 2010-12-06 15:00:27

+0

Эти вопросы описывают часть поведения с RGB (0,0,0), который, кажется, сломан. Я также пробовал маскировать с помощью механизмов WinAPI, которые все еще не работают и вызывают совершенно разные, но одинаково неправильные результаты. Поэтому мне все еще интересно, нашел ли кто-нибудь решение. – Coder 2010-12-06 15:07:26

+0

GDI 24ppp является основной проблемой, эффекты стекла требуют, чтобы альфа была установлена. Ссылка Лев выглядит неплохо. – 2010-12-06 16:00:04

ответ

2

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

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

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

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

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

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

0

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

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

+1

** Это не сработает. ** «Почти черный» будет просто отображаться как «почти стекло». И что вы подразумеваете под «классическими приложениями»? Очевидно, он пытается разработать приложение, которое работает с интерфейсом Aero. Он даже не может вытащить его из ворот, прежде чем объявлять его «классическим»? – 2010-12-06 14:56:45

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