![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
piritus |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 226 Регистрация: 3.1.2007 Где: Сибирь Репутация: нет Всего: 3 |
Здравствуйте.
Есть png с альфа-каналом, которую нужно поместить на кнопку. Т.к. стили CHILD и LAYERED не совместимы, то я подумал, что можно загрузить png, а потом заменить альфа-канал на какой-нибудь цвет. Потом создать регион с установленным цветом прозрачности изображения, который (цвет) был выбран при "раскрашивании" альфа-канала, а далее вырезать кнопку по региону. Скажите, это возможно? --------------------
|
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
альфа канал простым регионом не выявить,
такое решение подойдет только для прозрачности "по ключу" на дочерних компонентах это делается примерно так: http://forum.vingrad.ru/index.php?showtopi...t&p=1849405 тут нужно просто вставить вызов AlphaBlend с функцией альфа-канала, сразу после воспроизведения фона родителя -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
piritus |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 226 Регистрация: 3.1.2007 Где: Сибирь Репутация: нет Всего: 3 |
Спасибо за ссылку.
Пробую по ней, но вот что выходит. Думаю не важно, что на asm-е, суть от этого не меняется:
Для начала пробую на главном окне отрисовать. Вот результат выполнения этого кода: ![]() Если добавить:
то результат следующий: ![]() При перетаскивании окна, картинка сохраняется, т.е. окно не прозрачное как я понял... ![]() Подскажите, в чем дело? Может можно регионом выделить квадрат с изображением и оттуда вырезать черный цвет? Это сообщение отредактировал(а) piritus - 30.8.2009, 12:15 --------------------
|
||||
|
|||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
вообще-то асм читать не очень удобно,
но по первому скриншоту понятно, что родительский фон на дочернем окне не воспроизводится, а иконка рисуется по ключу прозрачности, как я понимаю, корректно смотри зависимости, проще всего, конечно использовать мой исходник, реализовать его на асме можно позже твой WM_ERASEBKGND равнозначен такому:
т.к. сообщение в любом случае глушится ret'ом можно даже не утруждать себя в выставлении eax, WindowFromDC я там ставил для перекрытия этого сообщения только если оно пришло в окно извне, для двойного буфера оно проходит стандартно вобщем, советую пока использовать все же С++ и WS_EX_LAYERED для главного окна, WS_EX_LAYERED - т.к. без него прозрачность будет либо условной, либо по таймеру, но в любом случае - используя гораздо больше ресурсов, чем это реализуется в ядре, а не обрабатывать WM_ERASEBKGND - это не прозрачность, это просто невосстановление фона окна, следствие на последнем скриншоте закономерно -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
попробовал объединить оба эффекта: WS_EX_LAYERED и AlphaBlend
в приложении немного переделаный примерчик из топика про прозрачность что я в нем делаю: сразу после воспроизведения фона родителя, рисую на нем битмап с альфа-каналом, сам битмап - это просто квадратная палитра цветов, а альфа-канал - это круг с увеличением прозрачности к его центру, т.е. края его видны отчетливо, а центр "просвечивает", получается некоторое подобие цветной, полупрозрачной сферы дочерний компонент можно таскать по родителю, так что можно внимательно изучить, где начинаются проблемы, а проблемы начинаются сразу, как только перенести компонент на полностью прозрачную область родителя, специально выставил ключ прозрачности на родительском окне в красный цвет (почти в красный), чтобы хорошо были заметны метамарфозы AlphaBlend, которые дают нам понять, что эффект от WS_EX_LAYERED не применяется к самому окну, т.е. мы видим не то, что рисуем ) т.к. альфа вне сферы равна нулю, то в этом месте должен проявляться фон, а раз он красный, значит родитель, как таковой, не просвечивает, он начинает просвечивать где-то на более низком уровне, но не на уровне самого окна, а значит AlphaBlend тут уже не помошник примерно то же самое можно наблюдать на полупрозрачных краях треугольной иконки AlphaBlend можно использовать только на непрозрачные зоны, это так же хорошо видно: область из разноцветных прямоугольников непрозрачна, поэтому на них альфа-канал работает если выставить атрибуты прозрачности родительского окна на альфа-прозрачность, то сфера вообще не будет круглой, т.к. в таком случае, у родителя не будет непрозрачных зон, альфа будет расчитываться над неактуальным фоном, и как следствие - нулевая альфа не даст прозрачности вобщем, если хочешь просвечивать PNG с неоднородной альфой абсолютно актуальным фоном десктопа или любого другого окна, без каких-либо особых ухищрений, типа хуков, это врятли получится, просто, на постоянном фоне - сколько угодно, но не "вперемешку с чужой [полу]прозрачностью", Добавлено через 10 минут и 58 секунд
конечно, всегда можно заменить дочернее окно на попап с WS_EX_LAYERED Присоединённый файл ( Кол-во скачиваний: 10 ) ![]() -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
piritus |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 226 Регистрация: 3.1.2007 Где: Сибирь Репутация: нет Всего: 3 |
Благодарю.
А исходник можно для большей наглядности? --------------------
|
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ну, тут мало изменений:
кстати, заметил интересное разоблачение: нужно скопировать экран с работающей программой (Alt + Print Scrn) и вставить скриншот в любой редактор, забавный способ снять "розовые очки" ) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
piritus |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 226 Регистрация: 3.1.2007 Где: Сибирь Репутация: нет Всего: 3 |
Интересно
![]() --------------------
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |