不是颜 2024-05-02 21:50 采纳率: 55.6%
浏览 45
已结题

MFC工具栏添加了一个按钮却没有显示

如下图,我在工具栏的后面添加了一些自定义的按钮,但是运行的时候却没有显示。

img


(创建mfc应用时选择的是单文档,并且选择的设置为下图所示)

img

运行结果:

img

  • 写回答

4条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-05-02 21:50
    关注
    让阿豪来帮你解答,本回答参考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()
    

    完成上述步骤后,再重新编译运行应用程序,即可在工具栏中看到自定义的按钮,并且能正常响应点击事件。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月3日
  • 创建了问题 5月2日

悬赏问题

  • ¥15 用C语言写离散数学相关问题
  • ¥30 如何用python的GephiStreamer连接到gephi中,把Python和Gephi的具体操作过程都展示,重点回答Gephi软件的调试,以及如果代码的端口在浏览器中无法显示怎么处理
  • ¥15 ansys机翼建模肋参数
  • ¥15 Sumo软件无法运行
  • ¥15 如何在vscode里搭建stata的编辑环境?
  • ¥15 dify知识库创建问题
  • ¥15 如何用C#的chart画1000万个点不卡顿
  • ¥15 爬虫技术找到网上看过房源客户的电话
  • ¥20 代码:Python随机森林反演生物量数据处理问题
  • ¥15 Linux系统的命令行窗口回车变成了换行,无法执行命令了