MFC中工具栏的定制

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.cppToolBarEx.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

职业:网络开发

国别:美国

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值