首页 > 解决方案 > 将真正透明的 32x32 按钮从位图添加到平面工具栏

问题描述

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

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

目前尚不清楚是否应该使用某种特定的颜色来表示透明度,或者我必须使用 alpha=255 表示透明度的 32 位位图。工具栏控件如何知道透明度颜色?指定样式 TBSTYLE_FLAT 或 TBSTYLE_TRANSPARENT 适用于 RGB(0xC0, 0xC0, 0xC0) 为透明色的 16x16、24x24 位图。但在 32x32 中,RGB(0xC0, 0xC0, 0xC0) 和 alpha=255 的 32 位图都不起作用。我用谷歌搜索并为此花了一整天,但未能找到明确的解决方案。有些提供在 24 位图中使用 GB(0xF0, 0xF0, 0xF0),这是按钮的背景颜色。这不是真正的透明度,我切换到高对比度主题,并注意到在 16x16 和 24x24 按钮中,工具栏透明度(颜色 #C0C0C0)工作正常,但对于 32x32 按钮它不起作用。有谁能够帮我?提前感谢先生。

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

标签: c++winapi

解决方案


当我使用 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);

推荐阅读