ImageList_Create поддерживает только 24-битные растровые изображения, что означает отсутствие альфа-канала для прозрачности.
Нет, это неправильно. ImageList_Create
также поддерживает 32-битные растровые изображения .
Поскольку вы намереваетесь создать панель инструментов в Win32, содержащую прозрачный значок, вам НЕ нужно загружать PNG вообще. Если вы хотите PNG, вам, возможно, придется обходиться с GdiPlus, как говорит @barmak.
32-битное растровое изображение имеет 8 бит для ALPHA. Использование 32-битных растровых изображений может дать тот же эффект, что и PNG.
Вы говорите, что изображение кнопки показывало пустым, когда вы делали это:
В ФАКТЕ Показать32-битное растровое изображение должно быть правильно:
изменить ILC_COLOR24
на ILC_COLOR32
изменить ресурс ID_IMG_SPAWN
в 32-битное растровое изображение с предварительно умноженным альфа .
создать раздел DIB для вашего растрового изображения при загрузке
(требование формата Win32 очень строго)
В: Как создать раздел DIB для растрового изображения?
A: Укажите LR_CREATEDIBSECTION
в последнем параметре LoadImage
.
Объяснение:
LoadImage((HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),MAKEINTRESOURCE(ID_IMG_SPAWN), IMAGE_BITMAP,32, 32,NULL)
Это ваш код функции LoadImage
. См. MSDN документ LoadImage , чтобы создать раздел DIB, все, что вам нужно, это указать LR_CREATEDIBSECTION
в последнем параметре LoadImage
.
Q: Какполучить BMP с предварительно умноженным альфа-каналом?
A: Pixelformer может помочь вам преобразовать ваш альфа-канал в файл с предварительно умноженным альфа-каналом BMP.
Шаги
- Откройте свое изображение (любой формат) в Pixelformer и выберите «Экспорт» в меню
Выберите A8: R8: G8: B8 (32 бит / с) и
Предварительно умноженное альфа , затем нажмите Ok.
Тогда вы можете сохранить файл BMP! Импортируйте этот файл BMP в ресурсы Visual Studio, заменив предыдущий 24-битный BMP.
Тогда вам больше не нужно использовать ImageList_AddMasked
(что делает изображение четким), потому что выуже есть узнаваемая альфа в вашем 32-битном BMP. Итак, прямое использование ImageList_Add
.
Хорошо, после манипуляций, описанных выше, ваш код должен выглядеть так:
// Create the toolbar
HWND hToolbar = CreateWindow(TOOLBARCLASSNAME,NULL,
WS_CHILD | TBSTYLE_FLAT | TBSTYLE_AUTOSIZE | TBSTYLE_LIST | CCS_BOTTOM,
0, 0, 0, 0, hwnd, NULL, ghInstance, NULL);
// Set the font (this cannot be the problem)
SendMessage(hToolbar, WM_SETFONT, (WPARAM)hFontBold,
static_cast<LPARAM>(MAKELONG(TRUE, 0)));
auto hImagelist =
ImageList_Create(32, 32,ILC_COLOR32 /*DON'T NEED THE MASK. CHANGED TO ILC_COLOR32.*/, 1, 0);
HBITMAP bitmap = static_cast<HBITMAP>(LoadImage((HINSTANCE)GetWindowLong(hwnd,
GWL_HINSTANCE), MAKEINTRESOURCE(ID_IMG_SPAWN), IMAGE_BITMAP,
32, 32, LR_CREATEDIBSECTION /*THIS IS IMPORTANT*/ ));
ImageList_Add(hImagelist, bitmap, NULL);
SendMessage(hToolbar, TB_SETIMAGELIST, static_cast<WPARAM>(0), (LPARAM)hImagelist);
Это работало нормально, как показано ниже.
На эти вопросы, на которые я ответил выше, этого вполне достаточно, чтобы решить эту проблему.
Для получения дополнительной информации о точечных рисунках DIB и Предварительно умноженное Альфа , см. Ссылки.