Что нового

_WinAPI_SetLayeredWindowAttributes не работает с Bin кодом картинки

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
Может в названии темы не так выразился, но не в этом проблема, у меня есть файл в котором записано 8 бинарных кодов картинок, я их применяю к Layered окну и окно должно стать прозрачным в регионах где присутствует например розовый цвет, но оно не становится таким как нужно, хотя если просто читать картинку с розовым цветом, то всё хорошо работает, в чём причина? и как сделать?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Потому что _GDIPlus_BitmapCreateHBITMAPFromBitmap() возвращает битмап с альфа-каналом (без прозрачности), т.е. значения альфа-канала везде равны 0xFF. В то время, как _WinAPI_SetLayeredWindowAttributes() воспринимает битмапы без альфа канала, т.е. значения альфа-канала везде должны быть равны 0x00. Отсюда и непонятки. Для конвертации первого во второй можешь воспользоваться следующим кодом:

Код:
$hResult = _WinAPI_CreateBitmap($Width, $Height, 1, 32)
$hDC = _WinAPI_CreateCompatibleDC(0)
$hSv = _WinAPI_SelectObject($hDC, $hResult)
_WinAPI_DrawBitmap($hDC, 0, 0, $hBitmap, $MERGECOPY)
_WinAPI_SelectObject($hDC, $hSv)
_WinAPI_DeleteDC($hDC)



Добавлено:
Сообщение автоматически объединено:

Вообще, Windows работает с DDB битмапами следующим образом. Если значения альфа-канала во всем битмапе равны 0, то такой битмап воспринимается без прозрачности. Если хотя бы одна точка в битмапе имеет значение отличное от 0, то такой битмап воспринимается с прозрачностью. Хотя, если картинка визуально не имеет прозрачности, то при альфа-канале 0x00 (везде) и 0xFF (везде) она будет выглядеть совершенно одинаково.
 
Верх