MFC中工具栏的定制
来源:http://www.codeproject.com/KB/toolbars/toolbarex.aspx
作者:Deepak Khajuria
翻译:xiaolang86
译者按:你是否受不了MFC中提供的呆板无趣的工具栏?你是否不想花银子去买控件而实现工具栏的多样化。看看下图,codeproject上的大牛将会解决你的烦恼。解决的途径就是使用扩展的工具栏类CToolBarEx。
介绍:
CToolbarEx类支持基本的在工具栏上加载控件的定制功能(IE风格),除此之外但工具栏停靠在垂直位置时,它还能自动隐藏某些控件。这个类以ToolBarCtrl提供的框架为基础实现工具栏的定制。同时,它也支持按钮上的超大图标和字体。
CToolbarEx类使用了Nikolay Denisov编写的CCustomizeDialog类从而在工具栏定制对话框中提供了额外的功能。
为了避免资源独立,我曾将CCustomizeDialog类中的一些变量用固定值来代替(hardcode)。这样做同时能够重写CDockBar类将其升级为CDockBarEx类,而后者提供了3D的可视化效果并克服了一些停靠的错误。
为了使用本文说介绍的类,请按以下步骤设置:
1. 将ToolBarEx.cpp和ToolBarEx.h加入到你的工程中。
2. 在主框架头文件中包含ToolbarEx.h,并用CToolBarEx替代主框架类里的CToolBar。如下:
3. 在CMainFrame类中重写OnCreate函数。当工具栏创建完毕(包括工具栏上的控件),调用SetToolBarInfoForCustomization函数设置工具栏中的定制数据。这个函数应该在工具栏、控件和下拉消息创建完毕厚调用。如下:
4. 恢复工具栏中最后一个保存的数据。如下:
类似地,你也可以在CMainFrame类的OnClose函数中加入保存状态。
5. 接着删除默认布局中你不需要的那些按钮。当然用户可以调用MarkDefaultState函数恢复工具栏的默认状态,具体做法是点击定制对话框上的Reset按钮。如下:
6. 用函数FrameEnableDocking代替EnableDocking,从而用CDockBarEx类代替CDockBar。如下:
成员函数与类数据
1. InsertControl函数
函数原型:
CWnd* InsertControl(CRuntimeClass* pClass, LPCTSTR lpszWindowName, CRect& rect, UINT nID, DWORD dwStyle )
该函数创造并插入一个控件到工具栏中,并返回说插入的窗口。其中的参数rect只传递宽度和高度。
2. InsertControl函数
函数原型:
CWnd* InsertControl(CWnd* pCtrl, CRect& rect, UINT nID)
该函数插入一个已经存在的控件到工具栏中。在rect参数中只传递宽度和高度。
3. AddDropDownButton函数
函数原型:
BOOL AddDropDownButton(UINT nIDButton, UINT nIDMenu, BOOL bArrow = TRUE )
该函数实现了具有下拉功能的菜单。如果希望在邻近菜单的位置显示指针,将便来那个bArrow设为TRUE。
4. SetToolBarInfoForCustomization函数
函数原型:
void SetToolBarInfoForCustomization()
该函数设置工具栏的定制信息。按钮的提示文字将显示定制对话框中的按钮名称(即在字符后面加上“/n”).当工具栏创建完毕再调用该函数。例如控件和下拉列表已经加入。
5. MarkDefaultState函数
函数原型:
void MakeDefaultState()
该函数设置工具栏的默认状态。点击定制对话框中的Reset按钮将恢复默认状态。
6. SaveState函数
函数原型:
void SaveState()
该函数把工具栏的状态存入到注册表中。
7. RestoreState函数
函数原型:
void RestoreState()
该函数从注册表中恢复工具栏的状态。
8. m_bHideChildWndOnVertical变量
该标记控制控件在垂直停靠模式下是否可见。默认值为TRUE。
9. HasButtonText函数
函数原型:
BOOL HasButtonText(int nID)
该函数用于决定按钮上的文字是或否右对齐。目前该函数总是返回TRUE值。重写该函数将会提供新的逻辑。nID是命令标示号。
最低要求
使用该类需要有5.80版本的Commctl32.dll。尽管不会使用该动态链接库的很多功能,但是有了该库系统能运行得更好。具体细节请下载Demo进行查看。
感谢所有的CodeProject/Code Guru的开发者。
历史
2001 年 10 月 16 日 ,更新上传文件;
2001 年 12 月 20 日 ,上传.net风格的文件;
许可
这篇文章以及所涉及的源码和文件均得到了CPOL(The Code Project Open License)的许可。
关于作者
姓名:Deepak Khajuria
开发经验:MFC/ATL开发2-3年
职业:网络开发
国别:美国