c++ - 将真正透明的 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,一切正常。
解决方案
当我使用 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);
推荐阅读
- reactjs - 如何在样式组件中使用自定义 html 元素?
- c++ - 如何使用 gradle (5.3.1) new nativ eplugin 将仅外部标头库包含到 gradle 本机构建中?
- ios - 将字符串转换为日期,给出不同的格式
- angularjs - 使用 JWT 和 AngularJS 处理页面刷新以维护用户数据的最佳方法是什么
- angularjs - 如何使用 ADAL js 前端管理多个租户、ClientID 和端点?
- css - 用于 SCSS 的 IntelliJ FileWatcher 无法正常工作
- sed - 使用 sed 清理 SchemaSync 输出
- java - JPA - 带有 in 子句和不区分大小写的规范
- html - 移动到下一个表单控件后如何更改 mat-input 文本颜色?
- angular - 所需的请求部分“文件”不存在 - Angular 4