Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Создание прозрачной иконки |
Автор: suxxor 18.3.2012, 21:29 | ||
Нужно создать иконку (HICON) и отобразить её в трее. Значок получаю так: (взято http://support.microsoft.com/kb/318876/en-us)
на выходе получается иконка с серым фоном и чёрным текстом, в чём проблема? |
Автор: suxxor 19.3.2012, 20:40 |
неважно какой цвет текста, интересует именно: что изменить в приведённой функции для получения прозрачного фона? |
Автор: GremlinProg 20.3.2012, 07:25 | ||
если коротко, то альфу здесь это 9F в 53 строке, поставишь FF, будет полностью прозрачный, только он будет и правда полностью прозрачный, т.е. невидимый ![]() поставь в цикле фильтр: если исходный цвет белый, значит поставить ему альфу FF, иначе - 0 или можешь полупрозрачность на текст наложить: вместо нуля что-нить вроде 7F если тебе нужна простая иконка, без полутонов, то заморачиваться с BITMAPV5HEADER не было смысла, обычная иконка, формируемая двумя растрами (через BITMAPINFOHEADER), и так имеет прозрачные зоны |
Автор: Alca 6.2.2013, 03:33 | ||
Не получается сделать иконку прозрачной (маска прозрачности - черная) при 16 битном цвете:
|
Автор: Alca 12.2.2013, 06:50 | ||
После таких манипуляций (по другому это никак не назовешь):
получилось вот это: |
Автор: artsb 12.2.2013, 08:28 | ||
Я не помню где лежит альфа канал. Если последний, то можно попробовать так:
|
Автор: GremlinProg 12.2.2013, 08:38 | ||
Alca, а какой у тебя там biCompression?
|
Автор: Alca 12.2.2013, 11:51 | ||||||
Попробывать сделать с BI_BITFIELDS ? |
Автор: GremlinProg 12.2.2013, 12:13 |
Да, думаю это будет правильней, чтобы не подбирать "эфемерную" маску прозрачности. Только обращай внимание, что каждая маска размером с DWORD, и тут нет комментария по поводу, должна ли быть четвертая маска в случае с наличием "альфы", или ее следует формировать взаимоисключением остальных трех. Возможно придется делать и так и так, пока не будет найдено верное решение. Не проще ли было использовать 8- и менее- битный формат для предоставления флагов? Там же цветов: раз-два и обчелся, их можно бы было держать отдельно в палитре, которая в таком случае располагается после BITMAPINFOHEADER. Там это простые RGBQUAD, у которых нет такой неопределенности с альфой. |
Автор: Alca 12.2.2013, 12:20 | ||
есть какой-то просто пример? |
Автор: GremlinProg 12.2.2013, 13:15 | ||
Понятных примеров не нашел. Здесь все то же самое, что ты сделал, но вместо bmi - выделяй память на
BITMAPINFOHEADER заполняешь как раньше, только ставишь 8 бит, а таблицу цветов ниже заполняешь цветами, которыми будешь использовать. Когда создашь DIB, у тебя будет указатель на байтовый массив - аналогичный тому, который у тебя сейчас 16-битный, расчитывай ширину строки и заполняй каждый байт номером цвета из той таблицы цветов, что ты заполнял при создании. Соответственно, альфу уже можно задать только в таблице цветов, поэтому, если два пиксела имеют одинаковые цвета, но разные альфы, индексы у них тоже разные. Для обычных картинок это работает, но будет ли в этом случае использоваться альфа - не знаю, не проверял. |