2011-01-24 1 views
0

В приложении MFC.Использование панели инструментов MFC и изображения PNG с прозрачностью, неправильные эффекты прозрачности

Я загружаю 32-битный PNG-файл с битами альфа-канала в Gdiplus :: Bitmap, используя FromFile.

Затем я использую Bitmap :: GetHBitmap для извлечения HBITMAP из Gdiplus :: Bitmap.

Я использую этот дескриптор, чтобы добавить растровое изображение в изображение.

Я использую этот imagelist для добавления кнопок панели инструментов на панель инструментов.

Однако по какой-то причине изображение не использует альфа-канал, как ожидалось. Вместо того, чтобы использовать альфа-канал для определения прозрачности, он использует комбинацию альфа-канала и как близко цвет пикселя к белому (0x ?? FFFFFF) для вычисления прозрачности. Таким образом, изображение с постепенно прозрачными белыми пикселями вообще не отображается, но изображение с прозрачно прозрачными черными пикселями отображается правильно.

Я позже отредактировал код, чтобы гарантировать, что мой битмап в HBitmap использует прозрачный цвет фона, а цвет фона в imagelist и панели инструментов прозрачен и имеет те же результаты.

Я также использовал HBITMAP для получения CBitmap и предварительно умножал битмапбит с использованием метода AlphaBlend(), чтобы рисовать на окне, и это правильно рисует.

Я убедился, что в моем списке изображений используется 32-битная настройка изображения - флаг ILC_COLOR32.

Итак, я знаю, что проблема заключается в том, как изображение добавляется либо в изображение, либо в панель инструментов, но не может понять, как исправить это.

Это все сделано динамически, поэтому у меня нет той же проблемы, что люди жалуются на VisualStudio, удаляя альфа-канал.

+0

Когда вы создаете imagelist, вы указываете флаг 'ILC_COLOR32'? –

+0

Да, я указываю, что флаг –

+0

Почему вы потратили столько времени * описывая * ваш код вместо * размещения * его? Гораздо проще отладить проблему, если я могу прочитать исходный код. –

ответ

0

Проблема решена, это был невероятно скрытый код, который превращал белизну в прозрачность. Это вне меня, почему, но там у вас это есть.

не стесняйтесь закрыть вопрос.