从位图向平面工具栏添加真正的透明32x32按钮

时间:2018-09-21 00:19:16

标签: c++ winapi

我的应用程序创建工具栏并向其添加自定义按钮。我可以选择添加16x16、24x24或32x32按钮。根据MSDN:

  

要创建透明工具栏,只需将TBSTYLE_FLAT或TBSTYLE_TRANSPARENT添加到CreateWindowEx的窗口样式参数中。

目前尚不清楚是否应该使用某些特定颜色的透明度,还是必须使用32位位图(其中alpha = 255表示透明度)。工具栏控件如何知道透明色?指定样式TBSTYLE_FLAT或TBSTYLE_TRANSPARENT适用于16x16、24x24位图,其中RGB(0xC0、0xC0、0xC0)是透明色。但是在32x32中,RGB(0xC0、0xC0、0xC0)和alpha = 255的32位位图均无效。我用Google搜索并花了整整一天的时间,但没有找到明确的解决方案。有些提供了在24位位图中使用GB(0xF0、0xF0、0xF0),这是按钮的背景色。这不是真正的透明度,我切换到高对比度主题,并注意到在16x16和24x24按钮中,工具栏透明度(颜色#C0C0C0)可以正常工作,但对于32x32按钮则无效。有谁能够帮助我?提前致谢 阿布扎德先生

编辑:我正在使用TB_ADDBITMAP将位图添加到工具栏。这仅显示了32bpp图像的1/4,没有透明度。我切换到TB_SETIMAGELIST,一切正常。

1 个答案:

答案 0 :(得分:2)

当我这样使用TB_ADDBITMAP时,存在问题:

TBADDBITMAP tb;
tb.hInst = GetModuleHandleW(nullptr);
tb.nID = IDR_TOOLBAR32;
unsigned uCount = 10;
SendMessageW(hwndTB, TB_ADDBITMAP, uCount, (LPARAM)&tb);

通过切换到ImageList,一切正常。我的新代码是这样:

const int cpWidth = 32;
const int iCount = 10;
const int idResource = IDR_TOOLBAR32;
HINSTANCE hInstance = GetModuleHandleW(nullptr);
HIMAGELIST hImageList = ImageList_Create(cpWidth, cpWidth,
    ILC_COLOR32 | ILC_MASK,
    iCount, 0
);
if (!hImageList) return -1;
HBITMAP hBitmapImage = (HBITMAP)LoadImageW(hInstance,
    MAKEINTRESOURCEW(idResource),
    IMAGE_BITMAP, iCount * cpWidth, cpWidth,
    LR_COPYFROMRESOURCE | LR_SHARED
);
if (!hBitmapImage) return -1;
ImageList_Add(hImageList, hBitmapImage, NULL);
SendMessageW(hwndTB, TB_SETIMAGELIST, (WPARAM)0, (LPARAM)hImageList);