1.1 在mfc中导航栏是通过哪个类负责的?
1.2 怎么创建导航栏?需要像对话框一样先创建资源,然后再在导航栏类里边关联资源吗?还是直接通过代码创建?如何添加导航栏中的项目?如何设置导航栏中每一项目的标题
1.3 导航栏创建后,如何为其添加单击事件响应程序?
关于在mfc中使用导航栏
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注让【宝码香车】来帮您解答,本回答参考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注意事项
- 停靠设置:根据需要设置导航栏的停靠位置
- 图标资源:可以为导航项目添加图标,需要创建相应的位图资源
- 样式定制:可以通过
CMFCVisualManager来定制导航栏的外观 - 内存管理:导航栏会自动管理添加的类别对象,不需要手动删除
这样创建的导航栏将具有类似 Office 导航面板的功能和外观。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报