Прозрачные битмапы с альфа-каналом
От: akulikov  
Дата: 17.10.06 21:35
Оценка:
Привет.

Никак не получается нарисовать 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, совместимость с предыдущими версиями не обязательна.
Буду благодарен за любую идею.

Всего хорошего
Re: Прозрачные битмапы с альфа-каналом
От: algol Россия about:blank
Дата: 17.10.06 21:54
Оценка:
Здравствуйте, akulikov, Вы писали:

A>Привет.


A>Никак не получается нарисовать 32-битный битамп с альфа-каналом.

A>Нарисовать мне его нужно не на тулбаре, а просто в диалоговом окне поверх фонового рисунка.
A>В результате вместо прозрачности получается каринка с черным фоном.
A>Манифест присутствует. В то же время в тулбаре та же картинка рисуется как надо.

Попробуйте грузить битмап в ImageList напрямую через АПИшную функцию ImageList_LoadImage(), а не через HBITMAP. HBITMAP насколько знаю не поддерживает прозрачность.
Re: Прозрачные битмапы с альфа-каналом
От: febus Германия  
Дата: 17.10.06 22:47
Оценка:
Здравствуйте, 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.
Re[2]: Прозрачные битмапы с альфа-каналом
От: akulikov  
Дата: 18.10.06 01:28
Оценка:
Здравствуйте, febus, Вы писали:


F>попробуйте рисовать так:

F>
F>m_ilBitmaps.Draw(pDC, 0, pt, ILD_TRANSPARENT);
F>


Не помогает. Правда фон теперь отображается белым цветом.

F>A вообще, я в этом мало чего понимаю, читайте классиков:

F>Прозрачность — это просто
Автор(ы): Виталий Брусенцев
Дата: 28.04.2001

Рассматриваются вопросы прозрачности и полупрозрачности при работе с
растровой графикой методами GDI. Приведены практические приемы работы с учетом
специфики Windows 95, Windows 98, Windows 2000.
Re[2]: Прозрачные битмапы с альфа-каналом
От: akulikov  
Дата: 18.10.06 01:40
Оценка:
Здравствуйте, algol, Вы писали:

A>>Манифест присутствует. В то же время в тулбаре та же картинка рисуется как надо.


A>Попробуйте грузить битмап в ImageList напрямую через АПИшную функцию ImageList_LoadImage(), а не через HBITMAP. HBITMAP насколько знаю не поддерживает прозрачность.


Попробовал, результат тот же. Правда так и не нашел куда в этом случае можно подставить ILC_COLOR32.
По поводу HBITMAP. Для тулбара я создаю ImageList точно таким же способом и тулбар корректно обрабатывает альфа-канал.
Re: Прозрачные битмапы с альфа-каналом
От: akulikov  
Дата: 18.10.06 03:04
Оценка:
Удалено избыточное цитирование. — 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

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

Всем спасибо за ответы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.