我的目的是在Win32中创建一个包含透明图标的工具栏。我尝试使用以下代码创建一个带有自定义图像的按钮的简单工具栏:
class Regex
// Create the toolbar
HWND hToolbar = CreateWindow(TOOLBARCLASsnAME,NULL,WS_CHILD | TBSTYLE_flaT | TBSTYLE_AUTOSIZE | TBSTYLE_LIST | CCS_BOTTOM,hwnd,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,NULL));
ImageList_AddMasked(hImagelist,bitmap,RGB(255,255,255) /* white is the transparent color */);
SendMessage(hToolbar,TB_SEtimagelist,static_cast<WPARAM>(0),(LPARAM)hImagelist);
仅支持24位位图,这意味着没有用于透明度的alpha通道。但是,我可以通过ImageList_Create
使用遮罩颜色来模拟透明效果。 (在这里,我将白色(ImageList_AddMasked
)设置为蒙版颜色。)
这很好用,但是由于alpha通道中缺少粒度(每个像素是透明的或完全不透明的),因此以这种方式显示的图像极其清晰/呈锯齿状。
我知道PNG格式可以解决此问题,因为它提供了真正的alpha通道。我知道Win32 ImageLists支持PNG格式,但是我不知道如何正确使用它。 (可以将PNG资源添加到Visual Studio资源中,但是我不知道如何从代码中使用它们。)
我找不到任何方法来使RGB(255,255)
加载PNG。唯一受支持的类型是LoadImage
IMAGE_BITMAP
和IMAGE_CURSOR
。我将资源(IMAGE_ICON
更改为PNG文件,并尝试了这三种类型中的每一种,但所有结果仅显示为空白:
有人可以帮我吗?如何使用ID_IMG_SPAWN
加载透明的PNG并将其用作工具栏图像?