CDialogEx中CMFCToolBar的LoadToolBarEx加载失败问题排查
LoadToolBarEx加载PNG工具栏失败但LoadBitmap正常的问题
我尝试使用LoadToolBarEx加载工具栏,但它始终返回0,工具栏中无图像显示;不过使用LoadBitmap时,图像可正常加载到工具栏中。
我的资源图像是32位PNG,尺寸32x128像素,包含4个按钮图像。
- 使用LoadToolBarEx时的效果:[加载失败的工具栏截图]
- 使用LoadBitmap时的效果:[加载正常的工具栏截图]
OnInitDialog中的代码
DWORD dwCtrlStyle = TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | CBRS_SIZE_DYNAMIC; DWORD dwStyle = AFX_DEFAULT_TOOLBAR_STYLE; if (m_ToolBar.CreateEx(this, dwCtrlStyle, dwStyle, CRect(1, 1, 1, 1), IDR_TOOLBAR1_PNG)) { dwStyle = CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC; m_ToolBar.SetPaneStyle(m_ToolBar.GetPaneStyle() | dwStyle); } CMFCToolBarInfo info; m_ToolBar.SetSizes(CSize(32, 32), CSize(32, 32)); BOOL ret1 = m_ToolBar.LoadToolBarEx(IDR_TOOLBAR1_PNG,info,FALSE); // << 此处失败 BOOL ret2 = m_ToolBar.LoadBitmap(IDR_TOOLBAR1_PNG); // << 此处正常 CMFCToolBarButton but1(0, 0, L"HELLO", TRUE, 0); CMFCToolBarButton but2(1, 1, L"HELLO", TRUE, 0); CMFCToolBarButton but3(2, 2, L"HELLO", TRUE, 0); but3.SetStyle(but3.m_nStyle | TBBS_DISABLED); m_ToolBar.InsertButton(but1, 0); m_ToolBar.InsertButton(but2, 0); m_ToolBar.InsertButton(but3, 0); m_ToolBar.SetToolBarBtnText(0, _T("By")); m_ToolBar.SetToolBarBtnText(1, _T("Your")); m_ToolBar.SetToolBarBtnText(2, _T("Command")); m_ToolBar.InsertSeparator(2); m_ToolBar.SetWindowPos(0, 0, 0, 400, 36, 0, 0);
TestDlg.rc中的资源定义
////////////////////////////////////////////////// // // PNG // IDR_TOOLBAR1_PNG PNG "res\\toolbarNEW.png" ////////////////////////////////////////////////// // // Toolbar // //////////////////////////////////////////////////
resource.h中的定义
#define IDR_TOOLBAR1_PNG 135
我尝试过多种图像格式组合,不认为是图像资源问题,请问LoadToolBarEx加载失败的原因是什么?
问题解答
LoadToolBarEx和LoadBitmap的核心区别在于:LoadBitmap只是单纯加载位图资源到工具栏的图像列表,而LoadToolBarEx需要对应的工具栏资源定义(不是单纯的PNG资源)来解析按钮布局、命令ID等元数据,它默认从.rc中的TOOLBAR类型资源读取配置,而非直接加载PNG图像。
你的问题出在以下两点:
- 资源类型不匹配:你仅定义了PNG类型资源,但
LoadToolBarEx期望的是包含按钮数量、命令ID、图像索引等元数据的TOOLBAR资源,而非单纯的图像文件。 - CMFCToolBarInfo未配置:即使想直接用PNG图像通过
LoadToolBarEx加载,也需要手动填充CMFCToolBarInfo的m_uiColdResID等字段指定图像资源ID,否则函数无法找到正确的图像来源。
修复方案
方案1:补充TOOLBAR资源定义
在.rc文件中添加对应的TOOLBAR资源,示例:
IDR_TOOLBAR1_PNG TOOLBAR 32, 32 BEGIN BUTTON ID_COMMAND_1 BUTTON ID_COMMAND_2 BUTTON ID_COMMAND_3 SEPARATOR END
注意这里的尺寸要和你的图像匹配,之后LoadToolBarEx就能正常读取工具栏配置并关联PNG图像。
方案2:手动配置CMFCToolBarInfo
如果不想定义TOOLBAR资源,修改代码如下:
CMFCToolBarInfo info; info.m_uiColdResID = IDR_TOOLBAR1_PNG; // 指定冷态图像资源ID info.m_uiHotResID = IDR_TOOLBAR1_PNG; // 不需要热态图可与冷态一致 info.m_uiDisabledResID = IDR_TOOLBAR1_PNG; // 禁用态图像资源ID BOOL ret1 = m_ToolBar.LoadToolBarEx(IDR_TOOLBAR1_PNG, info, FALSE);
这样LoadToolBarEx就能通过配置的info对象找到PNG资源,不再依赖TOOLBAR资源的元数据。
另外注意:调用LoadToolBarEx后无需再调用LoadBitmap,否则会覆盖图像列表,导致之前的加载效果被覆盖。
内容的提问来源于stack exchange,提问作者user20716902
相关产品推荐
相关产品推荐

