Как поместить иконку с прозрачным фоном на кнопку
От: _agg  
Дата: 02.11.20 07:49
Оценка:
Здраствуйте, столкнулся с проблемой, создаю кнопку(CMFCButton) помещаю на нее изображение и получаю:


Изображение иконки находится в четком квадрате другого цвета.
Если я не программно создаю кнопку а просто в ресурсах ее положу на форму и пропишу в свойствах изображение, то фон иконки будет цветом кнопки и этого квадрата не будет видно.
Как сделать прозрачный фон изображения помещаемого на кнопку CMFCButton?
код:
    m_btnTest.Create(L"Тест",
        WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_BITMAP,
        CRect(2, 99, 119, 136), this, IDC_MFCBUTTON1);
    CImageList imLst; imLst.Create(IDB_BITMAP1, 32, 4, ILC_COLOR32);
    m_btnTest.SetIcon(imLst.ExtractIcon(10));
    m_btnTest.m_bDrawFocus = TRUE;
    m_btnTest.m_nFlatStyle = CMFCButton::BUTTONSTYLE_FLAT;
    m_btnTest.m_bTransparent = true;
    m_btnTest.SetMouseCursorHand();
Отредактировано 02.11.2020 8:38 _agg . Предыдущая версия . Еще …
Отредактировано 02.11.2020 8:00 _agg . Предыдущая версия .
Отредактировано 02.11.2020 7:51 _agg . Предыдущая версия .
Отредактировано 02.11.2020 7:51 _agg . Предыдущая версия .
Re: Как поместить иконку на кнопку с прозрачным фоном
От: qaz77  
Дата: 02.11.20 08:44
Оценка:
Здравствуйте, _agg, Вы писали:


_>
CImageList imLst; imLst.Create(IDB_BITMAP1, 32, 4, ILC_COLOR32);


Неправильно ImageList создается.
В этой перегрузке CImageList::Create последний параметр COLORREF, а не флаги ILC_...
Должен указываться цвет, который считается маркером прозрачности, по нему будет сгенерирована маска.
Если мне склероз не изменяет, то это работает только для битмапов до 8bpp (256 цветов).

Если создавать CImageList с указанием флагов, то как минимум надо еще ILC_MASK указывать для поддержки прозрачности.

Даже, если битмапка 32bpp с альфа-каналом, то обычные GDI-шные функции не выводят с полупрозрачностью.
Там должна функция AlphaBlend использоваться или GDI+.

Надо смотреть, как CMFCButton иконку рисует. Если функциями DrawIcon или DrawState, то альфа-канал не будет учитываться.
Re[2]: Как поместить иконку на кнопку с прозрачным фоном
От: _agg  
Дата: 03.11.20 02:08
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Здравствуйте, _agg, Вы писали:



_>>
CImageList imLst; imLst.Create(IDB_BITMAP1, 32, 4, ILC_COLOR32);


Q>Неправильно ImageList создается.

Q>В этой перегрузке CImageList::Create последний параметр COLORREF, а не флаги ILC_...
Q>Должен указываться цвет, который считается маркером прозрачности, по нему будет сгенерирована маска.
Q>Если мне склероз не изменяет, то это работает только для битмапов до 8bpp (256 цветов).

Q>Если создавать CImageList с указанием флагов, то как минимум надо еще ILC_MASK указывать для поддержки прозрачности.


Q>Даже, если битмапка 32bpp с альфа-каналом, то обычные GDI-шные функции не выводят с полупрозрачностью.

Q>Там должна функция AlphaBlend использоваться или GDI+.

Q>Надо смотреть, как CMFCButton иконку рисует. Если функциями DrawIcon или DrawState, то альфа-канал не будет учитываться.


Спасибо большое, действительно взял иконку из другого проекта 8 бит цвет и все встало на свои места.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.