Irw*_*win 3 windows winapi transparency
编辑:我提供了赏金,因为我怀疑否则我会得到任何答案.
最近我一直在使用listviews,我决定为每个项目添加一个图标,指示它是输入还是输出.图标添加正常,但它们不透明:

可以看出,图标显然不透明.我正在做这样的事情加载图标:
hImageList = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 2, 2);
if (hImageList != NULL)
{
iIN = ImageList_AddIcon(hImageList, LoadIcon(hInstance, MAKEINTRESOURCE(101)));
iOUT = ImageList_AddIcon(hImageList, LoadIcon(hInstance, MAKEINTRESOURCE(102)));
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试弄乱了旗帜ImageList_Create和LoadIcon/ LoadImage但没有运气,说实话我已经没想完了.
任何帮助将非常感激.
Chr*_*cke 12
首先,ImageList_ReplaceIcon在将图标数据添加到图像列表时复制图标数据.因此HICON需要在之后发布.
接下来,图像列表是本机位图,而不是图标.而您创建图像列表的方式使得图标到位图的转换非常模糊.ILC_COLOR32意味着图像列表应创建为32位dib部分,通常通过嵌入式alpha通道包含透明度信息.相反,ILC_MASK意味着内部位图是DDB位图,透明度信息存储为1bpp掩码位图.
解决问题的最快方法 - 拿两个图标:
或者,为了更好的视觉效果......
(最后一个选项有点棘手,因为支持使用正确预乘的alpha通道写出32位bmp文件的工具数量相当低).
编辑添加以下代码示例.使用在开发环境中创建的4bpp位图,这非常有用: -
HWND hwndCtl = CreateWindowEx(0,WC_LISTVIEW,TEXT("ListView1"),WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL,0,0,cx,cy,hWnd,(HMENU)101,hModule,NULL);
HBITMAP hbm = (HBITMAP)LoadImage(hModule,MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,0);
COLORREF crMask=RGB(255,0,255);
HIMAGELIST himl = ImageList_Create(16,16,ILC_COLOR|ILC_MASK,2,0);
ImageList_AddMasked(himl,hbm,crMask);
ListView_SetImageList(hwndCtl,himl,LVSIL_NORMAL);
Run Code Online (Sandbox Code Playgroud)