前段时间,碰到对于PPT中控制一些命令的问题,也是很是查找了不少的资料,最后使用的是RibbonX的形式解决的,发现RibbonX也是如此的高效。
文章来自:《细品RibbonX(9):层次分明的RibbonX代码结构》
原文如下:(虽是对Excel的操作,但一些命令是通用的)
在前面的一些文章中,我们已经介绍过定制功能区的代码。在详细探讨功能区各元素之前,我们将先了解完整的RibbonX代码结构、如何使用各类工具定制功能区、以及至关重要的XML知识。下面,让我们先看看完整的RibbonX代码结构。 如果忽略定义控件的XML元素,那么完整的RibbonX结构如下:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" ...>
<commands>
<command ... />
</commands>
<ribbon ...>
<officeMenu>
可用于Office菜单中的任何控件类型
</officeMenu>
<qat>
<sharedControls>
<control>,<button> or <separator>控件类型
</sharedControls>
<documentControls>
<control>,<button> or <separator>控件类型
</documentControls>
</qat>
<tabs>
<tab ... >
<group ... >
所有控件类型
</group>
</tab>
</tabs>
<contextualTabs>
<tabSet idMSO="TabSetChartTools">
<tab ... >
<group ... >
所有控件类型
</group>
</tab>
</tabSet>
</contextualTabs>
</ribbon>
</customUI>
其中,省略号表示一个或多个可选的属性。可以看出,RibbonX代码结构是层次分明的。现在,让我们初步了解代码结构中的元素。
<customUI>元素是XML的根容器,命名空间将其识别为RibbonX文档。
<commands>元素用来重复利用内置控件。
<ribbon>元素包含功能区中所有可以利用的元素。可以包含下列元素以控制功能区的相应部分。
<officeMenu>元素用来定制Office菜单。
<sharedControls>元素代表共享控件。
<documentControls>元素代表文档控件。
<qat>元素用来定制快速访问工具栏。
<tabs>元素表示选项卡的集合。
<tab>元素创建选项卡。
<contextualTabs>元素创建上下文选项卡。
<group>元素用来创建组。

下面,让我们使用Excel示例来看看完整的RibbonX结构能够实现的用户界面。
禁用命令
使用command元素能够重载命令或者禁用命令。例如,下面的XML禁用“保存”命令:

<commands>
<command idMso="FileSave" enabled="false" />
</commands>

结果如图1所示: 

图1:禁用“保存”命令,该命令已变灰
从头开始创建功能区
将ribbon元素的StartFromScratch属性设置为True,从而去除所有的功能区界面元素,然后从头开始设计功能区。其XML为:

<ribbon startFromScratch="true">

在Office按钮菜单中添加自定义项
可以向Office按钮菜单中添加合适的自定义项。例如,下面的XML在Office按钮中添加按钮和菜单:

<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" />
<button id="rxSend2" label="My Menu2" />
<button id="rxSend3" label="My Menu3" />
<button id="rxSend4" label="My Menu4" />
<button id="rxSend5" label="My Menu5" />
<button id="rxSend6" label="My Menu6" />
<button id="rxSend7" label="My Menu7" />
<button id="rxSend8" label="My Menu8" />
<button id="rxSend9" label="My Menu9" />
</menu>
</officeMenu>

结果如图2所示: 

图2:在Office按钮中添加项目
自定义快速访问工具栏(QAT)
当将ribbon元素的StartFromScratch属性设置为True后,我们可以在设计时重新自定义快速访问工具栏。例如,下面的XML在QAT中放置“字体”组合框和“边框”拆分按钮:

<qat>
<sharedControls>
<control idMso="Font" />
</sharedControls>
<documentControls>
<control idMso="BordersGallery" />
</documentControls>
</qat>

其中sharedControls表示放置在其中的控件为共享控件,而documentControls表示放置其中的控件为文档控件(注意,周围带有边框)。结果如图3所示: 

图3:自定义快速访问工具栏
自定义功能区
下面的XML在功能区中添加一个名为“Menu”的选项卡。

 <tab id="rxExcelVBA" label="Menu">

接着,使用下面的代码在该选项卡中添加组。

<group idMso="GroupInsertChartsExcel" />

上述代码添加内置的“图表”组。结果如下图4所示: 

图4:在自定义选项卡“Menu”中添加“图表”组

<group id="rxAuditMisc" label="My Sample">
<box id="rxSortBox">
<control idMso="SortAscendingExcel" showLabel="false" />
<control idMso="SortDescendingExcel" showLabel="false" />
<control idMso="SortDialog" showLabel="false" />
</box>
<control idMso="Copy" />
<control idMso="PasteMenu" />
<separator id="rxAuditMiscSeparator1" />
<control idMso="NameManager" />
<control idMso="ViewFreezePanesGallery" />
<control idMso="WindowSwitchWindowsMenuExcel" />
</group>

上述代码添加一个名为“My Sample”的自定义组,box元素用来组织控件的排列,separator元素用来放置分隔条。结果如图5所示: 

图5:在自定义选项卡“Menu”中添加“My Sample”组,包含一些内置的功能

<group id="rxDemo" label="My Menu">
<menu id="rxMenu" label="Menu" imageMso="ReviewCompareMenu" size="large">
<menu id="subMenu1" label="SubMenu1">
<menu id="subMenu11" label="3-SubMenu1">
<button id="rxMenu11" label="Up" imageMso="OutlineMoveUp" />
<button id="rxMenu12" label="GoTo" imageMso="GoTo" />
<button id="rxMenu13" label="Down" imageMso="OutlineMoveDown" />
</menu>
</menu>
<menu id="subMenu2" label="SubMenu2">
<menu id="subMenu21" label="3-SubMenu2">
<button id="rxMenu21" label="Up" imageMso="OutlineMoveUp" />
<button id="rxMenu22" label="GoTo" imageMso="GoTo" />
<button id="rxMenu23" label="Down" imageMso="OutlineMoveDown" />
</menu>
</menu>
<menuSeparator id="MySeparator" />
<button id="rxMenuButton" label="Button" />
</menu>
</group>
上述代码添加一个名为“My Menu”的组,其中放置了嵌套的层级菜单。结果如下图6所示:
图6:在自定义选项卡“Menu”中添加“My Menu”组,包含层级菜单
<group id="rxMyGroup" label="My Sample Group1">
<button id="Button1" imageMso="HappyFace" size="large" label="BigButton" />
<separator id="rxSeparator1" />
<button id="b1" imageMso="HyperlinkInsert" size="large" label="Surf the Net" onAction="surf"/>
<button id="b2" imageMso="HappyFace" label="Smile" onAction="smile"/>
<button id="b3" imageMso="FormatPainter" label="Paint" onAction="paint"/>
<button id="b4" imageMso="AutoFilterClassic" label="Filter" onAction="filter"/>
</group>
上述代码添加一个名为“My Sample Group1”的组,其中放置了一些带有内置图像的控件并进行了合理布局。结果如下图7所示:  

图7:在自定义选项卡“Menu”中添加的“My Sample Group1”组,包含一些带有内置图像的控件
<group id="rxMyGroup1" label="My Sample Group2">
<toggleButton imageMso="TranslationToolTip" id="MyToggleButton" size="large" label="Insert My Object"/>
<separator id="rxSeparator2" />
<checkBox id="AllowChanges" label="Allow Changes" />
<dropDown id="ChooseDepartment" showLabel="true" label="Choose Department">
<item id="Dept1" label="Shipping" />
<item id="Dept2" label="Accounting" />
<item id="Dept3" label="Engineering" />
</dropDown>
<comboBox id="ComboBox1" label="ComboBox">
<item id="item1" label="one" imageMso="_1" />
<item id="item2" label="two" imageMso="_2" />
<item id="item3" label="three" imageMso="_3" />
</comboBox>
</group>
上述代码添加一个名为“My Sample Group2”的组,其中包含切换按钮、复选框、组合框、下拉框,并添加了项目。结果如图8所示:  

图8:在自定义选项卡“Menu”中添加的“My Sample Group2”组,包含切换按钮、复选框、下拉框和组合框,并在其中添加了选项
<contextualTabs>
<tabSet idMso="TabSetChartTools" />
</contextualTabs>
上述代码添加上下文选项卡,当选中工作表中的图表时,会出现“图表工具”选项卡,如图9所示:  

图9:选中图表后出现“图表工具”上下文选项卡 
完整的代码 
上述示例完整的XML代码如下:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<commands>
<command idMso="FileSave" enabled="false" />
</commands>
<ribbon startFromScratch="true">
<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" />
<button id="rxSend2" label="My Menu2" />
<button id="rxSend3" label="My Menu3" />
<button id="rxSend4" label="My Menu4" />
<button id="rxSend5" label="My Menu5" />
<button id="rxSend6" label="My Menu6" />
<button id="rxSend7" label="My Menu7" />
<button id="rxSend8" label="My Menu8" />
<button id="rxSend9" label="My Menu9" />
</menu>
</officeMenu>
<qat>
<sharedControls>
<control idMso="Font" />
</sharedControls>
<documentControls>
<control idMso="BordersGallery" />
</documentControls>
</qat>
<tabs>
<tab id="rxExcelVBA" label="Menu">
<group idMso="GroupInsertChartsExcel" />
<group id="rxAuditMisc" label="My Sample">
<box id="rxSortBox">
<control idMso="SortAscendingExcel" showLabel="false" />
<control idMso="SortDescendingExcel" showLabel="false" />
<control idMso="SortDialog" showLabel="false" />
</box>
<control idMso="Copy" />
<control idMso="PasteMenu" />
<separator id="rxAuditMiscSeparator1" />
<control idMso="NameManager" />
<control idMso="ViewFreezePanesGallery" />
<control idMso="WindowSwitchWindowsMenuExcel" />
</group>
<group id="rxDemo" label="My Menu">
<menu id="rxMenu" label="Menu" imageMso="ReviewCompareMenu" size="large">
<menu id="subMenu1" label="SubMenu1">
<menu id="subMenu11" label="3-SubMenu1">
<button id="rxMenu11" label="Up" imageMso="OutlineMoveUp" />
<button id="rxMenu12" label="GoTo" imageMso="GoTo" />
<button id="rxMenu13" label="Down" imageMso="OutlineMoveDown" />
</menu>
</menu>
<menu id="subMenu2" label="SubMenu2">
<menu id="subMenu21" label="3-SubMenu2">
<button id="rxMenu21" label="Up" imageMso="OutlineMoveUp" />
<button id="rxMenu22" label="GoTo" imageMso="GoTo" />
<button id="rxMenu23" label="Down" imageMso="OutlineMoveDown" />
</menu>
</menu>
<menuSeparator id="MySeparator" />
<button id="rxMenuButton" label="Button" />
</menu>
</group>
<group id="rxMyGroup" label="My Sample Group1">
<button id="Button1" imageMso="HappyFace" size="large" label="BigButton" />
<separator id="rxSeparator1" />
<button id="b1" imageMso="HyperlinkInsert" size="large" label="Surf the Net" onAction="surf"/>
<button id="b2" imageMso="HappyFace" label="Smile" onAction="smile"/>
<button id="b3" imageMso="FormatPainter" label="Paint" onAction="paint"/>
<button id="b4" imageMso="AutoFilterClassic" label="Filter" onAction="filter"/>
</group>
<group id="rxMyGroup1" label="My Sample Group2">
<toggleButton imageMso="TranslationToolTip" id="MyToggleButton" size="large" label="Insert My Object"/>
<separator id="rxSeparator2" />
<checkBox id="AllowChanges" label="Allow Changes" />
<dropDown id="ChooseDepartment" showLabel="true" label="Choose Department">
<item id="Dept1" label="Shipping" />
<item id="Dept2" label="Accounting" />
<item id="Dept3" label="Engineering" />
</dropDown>
<comboBox id="ComboBox1" label="ComboBox">
<item id="item1" label="one" imageMso="_1" />
<item id="item2" label="two" imageMso="_2" />
<item id="item3" label="three" imageMso="_3" />
</comboBox>
</group>
</tab>
</tabs>
<contextualTabs>
<tabSet idMso="TabSetChartTools" />
</contextualTabs>
</ribbon>
</customUI>
自定义Excel界面如图10所示:  
图10:自定义的Excel界面 看起来代码较多,其实并不复杂,如果大家有疑问,先不要着急,有概念就行,后面我们将慢慢详细地讲解。

 原文链接:http://www.360doc.com/content/09/1110/14/406571_8735933.shtml

转载于:https://www.cnblogs.com/SanMaoSpace/archive/2013/03/01/2939459.html

[转]VSTO Office二次开发RibbonX代码结构相关推荐

  1. VSTO Office二次开发PPTRibbonX命令操作及对象添加

    VSTO Office二次开发PPTRibbonX命令操作及对象添加 本篇分享对于Power Point中一些命令的操作和对于一些比较常用对象.特殊对象的添加功能. 对于Power Point命令操作 ...

  2. VSTO Office二次开发对PPT自定义任务窗格测试

    上篇文章对VSTO Office二次开发操作PPT功能做了简单测试,主要是如何创建一个外接程序并在新建PPT幻灯片时添加自定义文本信息.如何简单自定义任务窗格.如何添加可视化功能区的简单介绍,应该对于 ...

  3. VSTO Office二次开发键盘鼠标钩子使用整理

    VSTO Office二次开发键盘鼠标钩子使用整理 可能通过程序控制键盘的操作和控制鼠标的一些操作,网上提供比较多的也是比较好的就是通过钩子(Hook)的方式实现. 简单整理了一下,没有找到很好的程序 ...

  4. Discuz 二次开发 (一) 目录结构和运行逻辑

    Discuz 二次开发 (一) 目录结构和运行逻辑 目录结构 DISCUZ使用自己的框架,与现在主流的web框架不同,DISCUZ没有路由表,他的路由是由入口文件来实现的. api uc.php UC ...

  5. et操作 python wps_拿起来就用的office二次开发(python,win32com使用经历总结)

    通过使用office的开发接口,让我深深的领悟到了office的强大(应该wps也有二次开发的接口).每每看到工作中比较繁琐的office操作,总是想做个vba快捷键或者做个文档处理程序,从繁重的文本 ...

  6. 解决WPS及office二次开发接口无法注册的问题

    问题描述 使用QAxObject的setControl注册接口时返回失败的解决方法 二次开发接口名称 WPS文字 KWPS.Aplication WPS的Excel KET.Application W ...

  7. 敏捷开发“松结对编程”系列之十二:L型代码结构(质量篇之一)

    本文是"松结对编程"系列的第十二篇.(松结对编程栏目目录) 有没有一种管理方法,无需额外的测试活动,就能大幅度提高产品质量?L型代码结构就是其中一种候选方案. 缺陷的来源 要减少缺 ...

  8. CAA二次开发常用代码块

    概述 本文主要写了CAA二次开发常用的代码块.. 逻辑结构 Session->Document-> CATIDftDrawing ->pi p指针 i 结构 pi接口指针,pi指针一 ...

  9. [转]VSTO Office二次开发应用程序键盘鼠标钩子

    可能在使用VSTO技术对Office的相关程序进行操作时,会碰到用程序去控制一些快捷键的操作,可以对键盘进行挂钩,此时使用P/Invoke函数实现. 原文链接:<VSTO应用程序中加入键盘钩子& ...

最新文章

  1. c# winform 用子窗体刷新父窗体,子窗体改变父窗体控件的值
  2. 详谈为何不要使用Windows的notepad编写shell
  3. Mac下配置svn服务器
  4. 402. 移掉K位数字(单调栈)
  5. 移动开发平台性能比較
  6. Plain text, flat file, 及flat-file database 如何翻译
  7. request.cookie[name]的到的过期时间是{0001-1-1 0:00:00}
  8. python试卷生成_小学初中高中试卷自动生成
  9. 基于机器学习的恶意网站/仿冒网站检测实战
  10. arcgis面积计算
  11. C程序设计汇编试题(第三版 )谭浩强主编 第三章 选择题
  12. 达梦数据库同步部署方案
  13. 一次做数据报表的踩坑经历,让我领略了数据同步增量和全量的区别
  14. dejavu中如何添加html文件,如何使用iText和Flying Saucer在HTML中创建PDF格式的字体? | 所有编程讨论 | zhouni.net...
  15. MySQL中的子查询用法
  16. halcon 缺陷检测 药片检测(有无)
  17. python 切片器_Excel数据透视表应用之三切片器
  18. osm数据导入mysql_导入OSM数据至PostgreSQL数据库
  19. python 爬取漫画《黑鹭尸体宅配便》
  20. 网络安全入门基础须知

热门文章

  1. 服务器空闲搭建什么网站,空闲的云服务器可以干什么
  2. java实现线程同步的方法_Java实现线程同步方法及原理详解
  3. 昌邑机器人_上下料机器人昌邑机器人生产工厂
  4. Centos7 Docker Compose部署mysql5.7
  5. leetcode每日一题系列——797. 所有可能的路径
  6. Redis进阶实战用法深剖析
  7. python asyncio tcp server_Python 3.4 中新的 asyncio : Servers、Protocols 和 Transports
  8. 功能测试怎么学?阿里测试工程师教你4个步骤
  9. mysql 触发器 实例_mysql的触发器-含案例-含效果 | 时刻需
  10. Mysql进阶(2)——组复制