如何添加透明的PNG作为工具栏图标?

Aku*_*ako 5 c++ winapi png imagelist bmp

我的意图是在Win32中创建一个包含透明图标的工具栏。我已经尝试使用以下代码创建一个带有自定义图像的按钮的简单工具栏:

// 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, // <-this is the HINSTANCE of the application
                             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_COLOR24 | ILC_MASK, 1, 0);

HBITMAP bitmap = static_cast<HBITMAP>(LoadImage(ghInstance,
    /* ID_IMG_SPAWN is my custom resource -> */ MAKEINTRESOURCE(ID_IMG_SPAWN), 
                                                IMAGE_BITMAP,
                                                32, 32,
                                                NULL));
ImageList_AddMasked(hImagelist,
                    bitmap,
                    RGB(255,255,255) /* white is the transparent color */);
SendMessage(hToolbar,
            TB_SETIMAGELIST,
            static_cast<WPARAM>(0),
            (LPARAM)hImagelist);
Run Code Online (Sandbox Code Playgroud)

ImageList_Create仅支持24位位图,这意味着没有用于透明度的alpha通道。但是,我可以通过使用遮罩颜色来模拟透明效果ImageList_AddMasked。(在这里,我将白色(RGB(255, 255, 255))设置为蒙版颜色。)

效果很好,但是由于alpha通道中缺少粒度(每个像素是透明的或完全不透明的),因此以这种方式显示的图像非常清晰/呈锯齿状

我知道PNG格式可以解决此问题,因为它提供了真正的alpha通道。我知道Win32 ImageLists支持PNG格式,但是我不知道如何正确使用它。(可以将PNG资源添加到Visual Studio资源中,但是我不知道如何从代码中使用它们。)

我找不到任何方法来LoadImage加载PNG。仅支持的类型是IMAGE_BITMAP IMAGE_CURSORIMAGE_ICON。我将资源(ID_IMG_SPAWN)更改为PNG文件,并一一尝试了这三种类型,但所有结果仅显示为空白:

谁能帮我吗?如何使用LoadImage加载透明的PNG并将其用作工具栏图像?