通用面包屑导航栏控制器的实现与使用

在开发应用程序时,面包屑导航是一种常见的用户界面元素,它可以帮助用户了解当前位置,并提供返回上一级的快捷方式。本文将介绍一个通用的面包屑导航栏控制器的实现方法,该控制器不仅能够展示文件路径,还可以用于其他需要显示分隔字符串的项目。

功能特点

该面包屑导航栏控制器具有以下特点:

  • 能够展示任何带有分隔符的字符串作为面包屑导航。
  • 可以配置点击事件,使其进入编辑模式。
  • 支持单击和双击所有三个鼠标按钮时发送通知。
  • 如果面包屑项无法全部显示在控制器中,则支持“返回上一级”项。
  • 支持设置左侧边距和项间距。
  • 支持渐变背景。
  • 可以轻松自定义绘制面包屑项,以实现自己的绘制风格。

创建控制器

要将面包屑导航栏控制器添加到对话框中,请按照以下步骤操作:

  1. 在布局中添加自定义控制器。
  2. 设置属性的ID,例如IDC_CRUMBBAR。
  3. 在属性的类名中输入"MZCrumbBarCtrl"。
  4. 设置所需的样式标志,例如0x50810001。如果不想要边框(WS_BORDER),则从值中移除0x00800000。
  5. 然后,在对话框类中添加一个MZCrumbBar变量。

为了将自定义控制器与对话框布局中的m_CrumbBar变量连接起来,需要在DoDataExchange中添加一些代码:

void CCrumbBarDemoDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_CRUMBBAR, m_CrumbBar); }

然后在OnInitDialog中配置控制器:

// 在OnInitDialog中配置控制器

配置控制器

以下是控制器进入编辑模式的配置选项。可以在Create中设置StyleEx标志,或者使用MZCrumbBar::Style(...)来设置:

#define CRU_EDITOUTSIDE 0x00000010 // 点击必须在面包屑项之外 #define CRU_EDITONCLK_L 0x00000100 // 在左键单击时进入编辑模式 #define CRU_EDITONDBL_L 0x00000200 // 在左键双击时进入编辑模式 #define CRU_EDITONCLK_R 0x00000400 // 在右键单击时进入编辑模式 #define CRU_EDITONDBL_R 0x00000800 // 在右键双击时进入编辑模式 #define CRU_EDITONCLK_M 0x00001000 // 在中键单击时进入编辑模式 #define CRU_EDITONDBL_M 0x00002000 // 在中键双击时进入编辑模式 // 更多标志...

设置颜色和边距

以下是如何设置面包屑导航栏的颜色和边距:

m_CrumbBar.ColorDefault(RGB(255, 0, 0)); m_CrumbBar.ColorHot(RGB(255, 0, 0)); m_CrumbBar.BackgroundColor(RGB(255, 0, 0), RGB(0, 0, 0), true); m_CrumbBar.Margin(10); m_CrumbBar.ItemSpacing(6);

使用面包屑导航栏

以下是如何初始化面包屑导航栏并设置其属性:

// 初始化面包屑导航栏 m_CrumbBar.Path(_T("C:\\MyFolder\\SubFiles1\\SubFolder2\\")); m_CrumbBar.Delimiter(_T("\\")); m_CrumbBar.DelimiterMode(DM_RIGHT); // 创建PreItem并设置为"..\\" MZCrumbBar::CrumbBarItem PreItem(_T(""), _T("..\\")); m_CrumbBar.PreItem(PreItem); // 重建/更新面包屑导航栏 m_CrumbBar.BuildCrumbbar(); // 获取完整路径 CString path = m_crumbBar.Path(); // 获取特定面包屑项的路径 CString path = m_crumbBar.GetPath(pCrumbBarItem);

通知

当发生某些事件时,会使用一些通知消息来通知拥有者窗口:

#define NMCB_LBCLICK 1000 // 用户使用左键单击 #define NMCB_RBCLICK 1001 // 用户使用右键单击 #define NMCB_MBCLICK 1002 // 用户使用中键单击 #define NMCB_LBDBLCLICK 1003 // 用户使用左键双击 // 更多通知...

要在对话框中捕获通知消息,可以这样做:

// 在.h文件中 afx_msg void OnCrumbBarItemClicked(NMHDR *pNotifyStruct, LRESULT* pResult); // 在.cpp文件中 BEGIN_MESSAGE_MAP(CCrumbBarDemoDlg, CDialog) ON_NOTIFY(NMCB_LBCLICK, IDC_CRUMBBAR, OnCrumbBarItemClicked) END_MESSAGE_MAP() void CCrumbBarDemoDlg::OnCrumbBarItemClicked(NMHDR* pNotifyStruct, LRESULT* pResult) { NM_CRUMBBARITEM* pnmCrumbBarItem = (NM_CRUMBBARITEM*)pNotifyStruct; // 被点击的面包屑项 pnmCrumbBarItem->pCrumbBarItem; // 被点击项的面包屑路径 pnmCrumbBarItem->strCrumbPath; // 点击时的鼠标位置 pnmCrumbBarItem->pt; ... }

自定义绘制面包屑项

要改变面包屑导航栏的外观,需要覆盖几个函数:

// 返回面包屑项的宽度 virtual int OnMeasureItem(CDC* pDC, CrumbBarItem* pItem); // 返回PreItem的宽度(如果无法绘制所有面包屑项,则显示在开始处的项) virtual int OnMeasurePreItem(CDC* pDC); // 绘制面包屑项 virtual void DrawCrumbItem(CrumbBarItem* pItem, CDC* pDC, CRect rc); // 绘制PreItem virtual void DrawPreItem(CrumbBarItem* pItem, CDC* pDC, CRect rc);

可以参考源代码中的CBlockCrumbBar.h/.cpp文件,了解如何实现这些功能。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485