基于BIMBase平台加载或者编辑菜单,主要有两种方式:
方法一是使用菜单编辑工具,可视化编辑。不用编写代码,直接采用编辑框拖拽形成,就如MFC控件拖拽形成对话框一样。
方法二是通过接口的形式,根据平台提供的相应菜单编辑接口,编写相应代码,完成菜单添加删除等等操作。
方法一的优点是操作简单,编辑快捷,缺点是修改了菜单后必须通过编译才能加载,换句话说就是需要软件重启才能加载新的菜单。方法二的优点是可在代码中灵活控制,增加简单菜单时更加方便简洁。缺点是菜单量过大时,代码量会较大,还增加了代码的维护工作。
方法一与方法二都有合适的应用场景,用户可根据需求选择不同的方法,也可两者结合使用。
8.1.1 菜单编辑工具
使用菜单编辑工具需要两部分内容,一部分是菜单编辑工具的程序BCGRibbonDesigner.exe,如图8-1所示。另一部分是一个vs菜单项目,平台会提供一个模板项目TestRibbonDesign.sln,供开发者使用,如图8-2所示。

图8-1 菜单编辑启动项

图8-2 菜单项目模板
启动BCGRibbonDesigner.exe并选择打开TestRibbonDesign.vcproj。

图8-3 打开菜单项目

图8-4 编辑页面
选择‘Button’创建按钮。注意,按钮有几个必要的属性需要设置,如图8-5所示。选中按钮后,右侧的‘Properties’可以设置按钮的属性,其中包括‘Caption’设置按钮名称;‘ID’为自动生成,最好不要自己改动;‘Image’与‘Image Large’都是设置按钮图标的属性,‘Image’为设置小图标,‘Image Large’为设置大图标。‘Keys’为点击按钮需要启动的命令,该命令为代码里写的任何功能。

图8-5 属性设置
- 在编辑工具完成菜单的编辑后,保存并且重新编译TestRibbonDesign.sln,得到新的TestRibbonDesign.dll。
- 加载TestRibbonDesign.dll,根据界面配置(详见附录一)或plugin文件配置。两者菜单可以叠加。
软件重新启动即会加载新编辑的菜单。
通过提供的菜单编辑工具及菜单范例项目,简单的在程序中进行配置,即可快速在BIMBase平台上加载上自己的菜单,完成简单的二次开发功能。
8.1.2 接口代码编辑菜单
平台BPRibbonUtil类针对Ribbon提供了相应的操作接口。对应菜单编辑工具的接口如表8-1所示。
表8-1 菜单设置接口列表
功能 | 方法 | 描述 |
---|---|---|
Tab页 | ribbonAddCategory(CString,Uint,Uint,CSize,CSize,int) | 增加一个Tab页 |
ribbonRemoveCategory(CString) | 移除一个Tab页 | |
ribbonGetAllCategoryName(std::vector |
获取所有Tab页的名称 | |
ribbonIsExistCategory(CString) | 是否存在某个名称的Tab | |
ribbonShowOrHideCategory(CString, bool) | 是否显示某一Tab页 | |
ribbonGetActiveCategory() | 获取活动的Tab页 | |
面板 | ribbonAddPanel(CString, CString, HICON) | 增加一个Panel |
ribbonRemovePanel(CString, CString) | 移除一个Panel | |
按钮 | ribbonAddButton(CString,CString,CString,CString, HICON) | 增加一个按钮 |
ribbonRemoveButton(CString, CString, CString) | 移除一个按钮 |
示例代码8-1展示了创建菜单的过程。
std::vector<CString> vctStr;
BPRibbonUtil::ribbonGetAllCategoryName(vctStr);
int iNum = vctStr.size();
//增加Tab页
BPRibbonUtil::ribbonAddCategory(_T("动态测试"), NULL, NULL, CSize(16, 16), CSize(32, 32), iNum);
//增加panel
BPRibbonUtil::ribbonAddPanel(_T("动态测试"), _T("动态面板"));
HICON hIcon = AfxGetApp()->LoadIconW(IDI_Demo_ICON);
//增加button,
BPRibbonUtil::ribbonAddButton(_T("动态测试"), _T("动态面板"), _T("大图标"), _T("LayoutLine"), hIcon);
//刷新菜单栏
BPRibbonUtil::ribbonRecalcLayout();
代码8-1:创建菜单
范例中,ribbonGetAllCategoryName获取了目前所有的Tab数量,通过获取的数量确定ribbonAddCategory在菜单上加载的位置,ribbonAddCategory函数实现在Ribbon中增加一个名叫‘动态测试’的Tab页,接口中传入的参数分别是Tab页的名称、小图标id、大图标id、小图标大小、大图标大小、插入位置顺序,传入-1默认插入到Ribbon菜单的最后,需要注意的是传入0时代表插入到第一个。
ribbonAddPanel函数实现的是在已有的Tab页中增加一个面板,传入的参数分别是要添加的上级分类名称、面板名称、面板图标句柄、是否自动销毁图标、面板位置等,传入位置与Category一个原则,默认的只用传入前两个参数即可。
ribbonAddButton函数实现的是在已有的面板上增加一个按钮,传入的参数分别是分类名称、面板名称、按钮名称、按钮关联的命令、按钮图标句柄。通过此接口,即可完成菜单与命令的绑定,并且设置按钮的图标等操作。
在设置完相应的菜单后,需要调用ribbonRecalcLayout()接口,让菜单刷新。