如下图,我在工具栏的后面添加了一些自定义的按钮,但是运行的时候却没有显示。
(创建mfc应用时选择的是单文档,并且选择的设置为下图所示)
运行结果:
如下图,我在工具栏的后面添加了一些自定义的按钮,但是运行的时候却没有显示。
运行结果:
让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言问题分析:从设置中可以看出,该MFC应用程序是以单文档模式创建的。单文档模式只有一个窗口,在该窗口中显示一个文档视图。自定义的工具栏按钮无法直接添加到文档视图中。 解决方案:需要将自定义的工具栏按钮添加到框架窗口类中。具体步骤如下: 步骤1:打开工程,双击 MainFrm.h 文件,在类定义中添加变量和函数声明,用于自定义工具栏按钮的创建和处理。示例如下:
class CMainFrame : public CFrameWndEx
{
......
private:
CToolBar m_wndToolBar; // 自定义工具栏
CImageList m_ToolBarImages; // 工具栏图像
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnUpdateCheckButton(CCmdUI* pCmdUI);
afx_msg void OnCheckButton();
};
步骤2:在 MainFrm.cpp 文件中实现 OnCreate 函数,在其中添加自定义工具栏的创建代码。示例如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
// 创建标准工具栏
if (!m_wndToolBar.CreateEx(this, TBSTYLE_TRANSPARENT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("未能创建工具栏\n");
return -1; // 未能创建
}
// 创建自定义工具栏
if (!m_ToolBarImages.Create(IDB_TOOLBAR, 16, 0, RGB(192, 192, 192)))
{
TRACE0("未能创建工具栏图像列表\n");
return -1;
}
if (!m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ToolBarImages))
{
TRACE0("未能设置工具栏图像\n");
return -1;
}
if (!m_wndToolBar.GetToolBarCtrl().InsertButton(0, ID_BUTTON1, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0))
{
TRACE0("未能添加工具栏按钮\n");
return -1;
}
// 启用工具栏按钮
m_wndToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON1, TRUE);
// 可视化与用户接口相关的设置
EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndToolBar);
return 0;
}
步骤3:在 MainFrm.cpp 文件中实现 OnUpdateCheckButton 和 OnCheckButton 函数,用于处理自定义工具栏按钮的状态变化和点击事件。示例如下:
void CMainFrame::OnUpdateCheckButton(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(1); // 默认为选中状态
}
void CMainFrame::OnCheckButton()
{
AfxMessageBox(_T("自定义工具栏按钮被点击了"));
}
步骤4:在 MainFrm.h 文件中添加消息映射,将自定义工具栏按钮的消息与响应函数相关联。示例如下:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
......
ON_UPDATE_COMMAND_UI(ID_CHECK_BUTTON, &CMainFrame::OnUpdateCheckButton)
ON_COMMAND(ID_CHECK_BUTTON, &CMainFrame::OnCheckButton)
END_MESSAGE_MAP()
完成上述步骤后,再重新编译运行应用程序,即可在工具栏中看到自定义的按钮,并且能正常响应点击事件。