在开发应用程序时,面包屑导航是一种常见的用户界面元素,它可以帮助用户了解当前位置,并提供返回上一级的快捷方式。本文将介绍一个通用的面包屑导航栏控制器的实现方法,该控制器不仅能够展示文件路径,还可以用于其他需要显示分隔字符串的项目。
该面包屑导航栏控制器具有以下特点:
要将面包屑导航栏控制器添加到对话框中,请按照以下步骤操作:
为了将自定义控制器与对话框布局中的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文件,了解如何实现这些功能。