一、在Ribbon功能区上自定义界面
1.1Ribbon简介
在Office 2007中,Microsoft使用了称作Ribbon的全新界面,Ribbon对应的部分如下图的1区域,它包括以下部分:Office Button(按钮,区域2), Quick Access(快速访问工具栏,区域3), Tabs(选项卡,区域4), Contextual Tabsets(上下文标签集,区域5), Groups Tabs(组选项卡,区域6)
1.2初识RibbonX
RibbonX是一种供开发者或最终用户定制功能区的方法,即功能区的可编程机制。功能区(Ribbon)是Office 2007应用程序界面的一部分,而RibbonX是指通过使用XML为自定义的应用程序来创建功能区元素(组件)的编程接口。
1.3实现接口IRibbonExtensibility
IRibbonExtensibility定义在Office类型库中,该类型库的id为{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52},在头文件开头处导入类型库
C++ #import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" version("2.5") auto_rename auto_search raw_interfaces_only rename_namespace("Office") |
该接口只有一个函数,重写GetCustomUI,该函数主要用来加载自定义界面XML文件,通过出参RibbonXml获取xml中的内容。
涉及太多COM内容,用法可以参考资料:https://blog.csdn.net/u011304970/article/details/72863693
1.4XML中各元素的用法
- 在开始前插入新的Test选项卡,并在Groups Tabs中添加按钮
XML <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon> <tabs> <tab id="myTab" insertBeforeMso ="TabHome" label="我的选项卡"> <group id="Group1" label="第一组"> <button id="NewCustomButton" imageMso="WebPagePreview" size="large" label="测试按钮" onAction="ButtonClicked"/> </group> <group id="Group2" label="第二组"> <button id="Button1" label="按钮1" imageMso="Bold"/> <button id="Button2" label="按钮2" imageMso="Italic"/> <button id="Button3" label="按钮3" imageMso="Underline"/> </group> </tab> </tabs> </ribbon> </customUI> |
xmlns为命名空间,其中包含所有元素名字的定义
tab元素中的属性insertBeforeMso 作用是在指定的idMso前插入选项卡,tab所有的属性可以在以下网站找到:
[MS-CUSTOMUI]: tab (Tab) | Microsoft Learn
TabHome为开始选项卡的idMso,所有idMso可以在以下网站找到:
[MS-CUSTOMUI]: PowerPoint 2007 | Microsoft Learn
imageMso是office自带的图片资源
onAction中的字符串是点击按钮时调用的函数,需要在工程代码中定义
- 在Office Button中插入菜单项和二级菜单(office2009后没法使用)
HTML <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" loadImage="LoadImage"> <ribbon> <officeMenu> <button id="rxOMBtn1" label="My Office Button1"/> <button id="rxOMBtn2" label="My Office Button2"/> <menu id="MyOfficeMenu" label="My Office Menu"> <button id="rxSend1" label="My Menu1"/> </menu> </officeMenu> </ribbon> </customUI> |
其他元素用法可以参考:https://blog.csdn.net/nodeman/article/details/79419386
- 可以使用CustomUIEditor.exe验证XML的内容格式是否正确
- 先创建一个ppt,然后用CustomUIEditor.exe打开
- 输入xml内容,完毕后点击左上角第四个按钮进行验证
- 保存后直接打开该PPT就能看到自定义的界面效果
- 有些元素是在office2009之后才有用,比如contextMenus,可以通过Insert进行选中
1.5在xml中使用回调
每个元素都有属于自身的回调方法,button元素可以使用onAction进行回调,以下尝试对一个按钮
使用GetEnabled回调
xml内容如下:
HTML <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon> <tabs> <tab id="myTab" insertBeforeMso ="TabHome" label="我的选项卡"> <group id="Group1" label="第一组"> <button id="NewCustomButton" imageMso="WebPagePreview" size="large" label="测试按钮" getEnabled="GetEnabled"/> </group>
</tab> </tabs> </ribbon> </customUI> |
在接口文件.idl中添加,其中回调函数的定义在以下网页中:
https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2007/aa722523(v=office.12)
C++ interface IConnect : IDispatch { ...... HRESULT GetEnabled([in]IDispatch* ribbtonControl, [out, retval] VARIANT_BOOL *pvarfEnabled); }; |
在插件类头文件.h中加入
C++ //IConnect 实现 ...... virtual HRESULT __stdcall GetEnabled(IDispatch ribbtonControll, VARIANT_BOOL *pvarfEnabled); |
源文件中添加定义
C++ HRESULT __stdcall CKisOfficeAddin::GetEnabled(IDispatch* ribbtonControll, VARIANT_BOOL *pvarfEnabled) { *pvarfEnabled = VARIANT_FALSE;
return S_OK; } |
效果如下: