You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Win32应用工具栏按钮无法设置自定义ICO图标求助

解决Win32工具栏按钮自定义图标不显示的问题

嘿,我仔细看了你的代码,找到几个关键问题,改完就能正常显示图标了:

问题1:TBBUTTON的iBitmap字段使用错误

你现在在TBBUTTON结构体里填的是MAKELONG(IDI_ICON1, ImageListID),但这个字段其实是图像列表中的索引值(从0开始),不是图标资源ID。你往g_hImageList里添加图标的顺序是IDI_ICON1、IDI_ICON2、IDI_ICON3、IDI_ICON4,所以对应的索引应该是0、1、2、3。

问题2:多余的TB_LOADIMAGES调用

你调用了SendMessage(hWndToolbar, TB_LOADIMAGES, ...)加载系统标准控件图像,这会覆盖你之前设置的自定义图像列表,直接删掉这一行就行——你要使用自己的图标,不需要系统默认的。

问题3:图标尺寸不匹配

你创建ImageList时指定的是16x16的尺寸,你的ICO文件必须包含16x16像素的图标版本。如果图标只有更大的尺寸(比如32x32),LoadIcon虽然能返回非零句柄,但图像列表无法正确解析,就会出现“无法读取内存”的提示,按钮也显示为空。


修正后的关键代码片段

// 去掉这行多余的系统图像加载代码
// SendMessage(hWndToolbar, TB_LOADIMAGES, (WPARAM)IDB_STD_SMALL_COLOR, (LPARAM)HINST_COMMCTRL);

// 修改后的TBBUTTON数组,iBitmap用图像列表索引
TBBUTTON tbButtons[numButtons] = {
    { 0, IDM_INPUT, TBSTATE_ENABLED, buttonStyles, {0}, 0, 0 },
    { 1, IDM_OUTPUT, TBSTATE_ENABLED, buttonStyles, {0}, 0, 0},
    { 2, IDM_TRIANGULATE, TBSTATE_ENABLED, buttonStyles, {0}, 0, 0},
    { 3, IDM_STOP, TBSTATE_ENABLED, buttonStyles, {0}, 0, 0}
};

另外,建议你用LoadImage代替LoadIcon,它能更明确地指定图标尺寸,避免尺寸不匹配的问题,示例:

HICON hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
ImageList_AddIcon(g_hImageList, hIcon);
DestroyIcon(hIcon); // 用完记得释放图标句柄

这样修改后,工具栏按钮应该就能正常显示你的自定义图标了!

内容的提问来源于stack exchange,提问作者Nu pogodi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:33:59