Я узнал, что Visual Studio распознает ТОЛЬКО 24 бит / с.
Нет, это неправильно. Visual Studio поддерживает 32-битные битовые карты с предварительным умножением .
32-битное растровое изображение имеет 8 бит для ALPHA, оно способно создавать плавный эффект.
Чтобы правильно отобразить 32-разрядное растровое изображение, необходимо:
(требование формата 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?"«Что такое Преумноженная Альфа?». Это глубокие темы.
Чтобы узнать битовые карты DIB и Предварительно умноженная альфа , см. Ссылки.