Привет.
Никак не получается нарисовать 32-битный битамп с альфа-каналом.
Нарисовать мне его нужно не на тулбаре, а просто в диалоговом окне поверх фонового рисунка.
Вот кусок кода:
CImageList m_ilBitmaps;
// ................................
CBitmap* pBmp;
pBmp = new CBitmap;
HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE(IDB_STARTINDICATOR), RT_BITMAP);
HBITMAP hBmp = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(IDB_STARTINDICATOR),
IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_CREATEDIBSECTION);
pBmp->Attach(hBmp);
// pBmp->LoadBitmap(IDB_STARTINDICATOR); Такой вариант работает аналогично.
m_mapBitmaps[IDB_STARTINDICATOR] = pBmp;
// ..............
m_ilBitmaps.Create(15, 15, ILC_COLOR32, 2, 2);
m_ilBitmaps.Add(pBmp, (CBitmap*)NULL);
// ..............
// Здесь пробую рисовать
CPoint pt;
pt.x = rClient.right-15;
pt.y = rClient.top ;
m_ilBitmaps.DrawIndirect (pDC, 0, pt, CSize(0,0), CPoint(0,0), ILD_PRESERVEALPHA, SRCCOPY, CLR_NONE,
CLR_NONE, ILS_NORMAL, 0, CLR_DEFAULT);
В результате вместо прозрачности получается каринка с черным фоном.
Манифест присутствует. В то же время в тулбаре та же картинка рисуется как надо.
Подскажите, в чем моя ошибка. Может есть какой-то другой способ нарисовать без использования CImageList ?
Программа должна работать на Windows XP SP2, совместимость с предыдущими версиями не обязательна.
Буду благодарен за любую идею.
Всего хорошего
Здравствуйте, akulikov, Вы писали:
A>Привет.
A>Никак не получается нарисовать 32-битный битамп с альфа-каналом.
A>Нарисовать мне его нужно не на тулбаре, а просто в диалоговом окне поверх фонового рисунка.
A>В результате вместо прозрачности получается каринка с черным фоном.
A>Манифест присутствует. В то же время в тулбаре та же картинка рисуется как надо.
Попробуйте грузить битмап в ImageList напрямую через АПИшную функцию ImageList_LoadImage(), а не через HBITMAP. HBITMAP насколько знаю не поддерживает прозрачность.
Здравствуйте, akulikov, Вы писали:
A>Привет.
A>Никак не получается нарисовать 32-битный битамп с альфа-каналом.
A>Нарисовать мне его нужно не на тулбаре, а просто в диалоговом окне поверх фонового рисунка.
A>Вот кусок кода:
A>
A> m_ilBitmaps.DrawIndirect (pDC, 0, pt, CSize(0,0), CPoint(0,0), ILD_PRESERVEALPHA, SRCCOPY, CLR_NONE,
A> CLR_NONE, ILS_NORMAL, 0, CLR_DEFAULT);
A>
попробуйте рисовать так:
m_ilBitmaps.Draw(pDC, 0, pt, ILD_TRANSPARENT);
A вообще, я в этом мало чего понимаю, читайте классиков:
Прозрачность — это простоАвтор(ы): Виталий Брусенцев
Дата: 28.04.2001
Рассматриваются вопросы прозрачности и полупрозрачности при работе с
растровой графикой методами GDI. Приведены практические приемы работы с учетом
специфики Windows 95, Windows 98, Windows 2000.
Удалено избыточное цитирование. — SchweinDeBurg
A>A> m_ilBitmaps.DrawIndirect (pDC, 0, pt, CSize(0,0), CPoint(0,0), ILD_PRESERVEALPHA, SRCCOPY, CLR_NONE,
A> CLR_NONE, ILS_NORMAL, 0, CLR_DEFAULT);
A>
Все получилось.

Убрал флаг ILD_PRESERVEALPHA и все работает как надо.
ILD_PRESERVEALPHA (0x00001000) Preserves the alpha channel in the destination
Непонятно только какой альфа-канал он там сохраняет. Убил кучу времени на него.
Самое интересное, что когда я его раньше убирал, рисунок выводился с белым фоном. Поэтому и посчитал, что он нужен.
Причиной оказывается было то, что под рисунком фон очищали белым цветом в другом месте функции (коллеги постарались

).
Всем спасибо за ответы.