qq_41945416 2025-11-16 10:08 采纳率: 90.6%
浏览 7
已结题

关于在mfc中使用导航栏

1.1 在mfc中导航栏是通过哪个类负责的?
1.2 怎么创建导航栏?需要像对话框一样先创建资源,然后再在导航栏类里边关联资源吗?还是直接通过代码创建?如何添加导航栏中的项目?如何设置导航栏中每一项目的标题
1.3 导航栏创建后,如何为其添加单击事件响应程序?

  • 写回答

3条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-11-16 11:44
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案能帮助您,请采纳,非常感谢!
    .
    每日一句正能量,让它带给您好心情:别让别人的评价,左右你的人生,你才是自己的主角。
    .

    MFC 导航栏使用详解

    1.1 导航栏负责类

    在 MFC 中,导航栏主要通过 CMFCToolBar 类负责,特别是用于创建类似 Office 风格的导航面板。对于更专门的导航控件,可以使用 CMFCNavigationPane 类。

    1.2 创建导航栏

    创建方式

    导航栏可以直接通过代码创建,不需要像对话框那样先创建资源。

    创建步骤

    // 在 MainFrm.h 中添加成员变量
    CMFCNavigationPane m_wndNavigationPane;
    
    
    // 在 MainFrm.cpp 的 OnCreate 函数中创建导航栏
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
            return -1;
        
        // 创建导航栏
        if (!m_wndNavigationPane.Create(_T("导航栏"), this, CRect(0, 0, 200, 200), 
            ID_VIEW_NAVIGATION, WS_CHILD | WS_VISIBLE | CBRS_LEFT))
        {
            TRACE0("未能创建导航栏\n");
            return -1;
        }
        
        // 添加导航栏项目
        AddNavigationItems();
        
        return 0;
    }
    

    添加导航项目和设置标题

    void CMainFrame::AddNavigationItems()
    {
        // 创建第一个导航类别
        CMFCToolBar* pFirstCategory = new CMFCToolBar;
        pFirstCategory->Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_NAV_CATEGORY1);
        pFirstCategory->SetOwner(this);
        
        // 添加按钮到类别
        pFirstCategory->InsertButton(CMFCToolBarButton(ID_BUTTON1, 0, _T("项目1")));
        pFirstCategory->InsertButton(CMFCToolBarButton(ID_BUTTON2, 1, _T("项目2")));
        pFirstCategory->InsertButton(CMFCToolBarButton(ID_BUTTON3, 2, _T("项目3")));
        
        // 将类别添加到导航栏并设置标题
        m_wndNavigationPane.AddCategory(
            _T("第一类别"),  // 类别标题
            pFirstCategory,  // 工具栏
            IDB_NAV_ICONS1  // 图标资源ID(可选)
        );
        
        // 创建第二个导航类别
        CMFCToolBar* pSecondCategory = new CMFCToolBar;
        pSecondCategory->Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_NAV_CATEGORY2);
        pSecondCategory->SetOwner(this);
        
        pSecondCategory->InsertButton(CMFCToolBarButton(ID_BUTTON4, 3, _T("设置")));
        pSecondCategory->InsertButton(CMFCToolBarButton(ID_BUTTON5, 4, _T("帮助")));
        
        m_wndNavigationPane.AddCategory(
            _T("第二类别"),
            pSecondCategory,
            IDB_NAV_ICONS2
        );
    }
    

    1.3 添加单击事件响应

    方法一:使用消息映射

    // 在头文件中添加消息映射
    class CMainFrame : public CFrameWndEx
    {
    protected:
        afx_msg void OnNavigationButton(UINT nID);
        DECLARE_MESSAGE_MAP()
    };
    
    
    // 在实现文件中
    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
        ON_COMMAND_RANGE(ID_BUTTON1, ID_BUTTON5, OnNavigationButton)
    END_MESSAGE_MAP()
    
    
    void CMainFrame::OnNavigationButton(UINT nID)
    {
        switch (nID)
        {
        case ID_BUTTON1:
            // 处理项目1点击
            AfxMessageBox(_T("项目1被点击"));
            break;
        case ID_BUTTON2:
            // 处理项目2点击
            AfxMessageBox(_T("项目2被点击"));
            break;
        case ID_BUTTON3:
            // 处理项目3点击
            AfxMessageBox(_T("项目3被点击"));
            break;
        case ID_BUTTON4:
            // 处理设置点击
            AfxMessageBox(_T("设置被点击"));
            break;
        case ID_BUTTON5:
            // 处理帮助点击
            AfxMessageBox(_T("帮助被点击"));
            break;
        }
    }
    

    方法二:使用 ON_UPDATE_COMMAND_UI

    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
        ON_COMMAND(ID_BUTTON1, OnButton1)
        ON_UPDATE_COMMAND_UI(ID_BUTTON1, OnUpdateButton1)
    END_MESSAGE_MAP()
    
    
    void CMainFrame::OnButton1()
    {
        // 处理按钮1点击
        AfxMessageBox(_T("按钮1被点击"));
    }
    
    
    void CMainFrame::OnUpdateButton1(CCmdUI* pCmdUI)
    {
        // 更新按钮状态
        pCmdUI->Enable(TRUE);
    }
    

    资源文件定义

    resource.h 中定义命令ID:

    #define IDR_NAV_CATEGORY1         130
    #define IDR_NAV_CATEGORY2         131
    #define ID_BUTTON1                132
    #define ID_BUTTON2                133
    #define ID_BUTTON3                134
    #define ID_BUTTON4                135
    #define ID_BUTTON5                136
    #define ID_VIEW_NAVIGATION        137
    #define IDB_NAV_ICONS1           138
    #define IDB_NAV_ICONS2           139
    

    注意事项

    1. 停靠设置:根据需要设置导航栏的停靠位置
    2. 图标资源:可以为导航项目添加图标,需要创建相应的位图资源
    3. 样式定制:可以通过 CMFCVisualManager 来定制导航栏的外观
    4. 内存管理:导航栏会自动管理添加的类别对象,不需要手动删除

    这样创建的导航栏将具有类似 Office 导航面板的功能和外观。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月29日
  • 已采纳回答 12月21日
  • 创建了问题 11月16日