细品RibbonX(54):RibbonX和Visual Studio(2)
下面,让我们继续使用Visual Studio为功能区添加更多的功能。
- 创建带有组和控件的新选项卡
- 在现有的选项卡中添加新控件
- 在Office菜单中添加新控件
- 重利用现有选项卡中的控件
- 重利用Office菜单中的控件
重利用是指将现有的控件实现新功能或者增强现有的功能。
在Visual Studio中处理图形
在使用Visual Studio时,必须提供图形作为加载项的一部分,这意味着要创建额外的代码。满足这项特定需求的XML作为customUI元素的一部分:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load" loadImage="GetImage">
在代码中,loadImage属性提供对GetImage()方法的调用,但GetImage()方法不知道要求向Office应用程序发送哪个图标或图像,因此必须以某种方式创建使它能处理任何需求。下面是GetImage()方法的代码:
Public Function GetImage(ByVal ImageName As String) As Bitmap ' 包含传递到Office的位图 Dim ThisBitmap As Bitmap = New Bitmap(20, 20) ' 发现图像名和相应的资源 Select Case ImageName Case "Colorblk2" ThisBitmap = New Bitmap(My.Resources.Colorblk2) Case "TIME" ThisBitmap = New Bitmap(My.Resources.TIME.ToBitmap()) End Select ' 返回简单的位图 Return ThisBitmap End Function
本例使用两类不同的图像。第一个是标准的位图,Colorblk2,因此可以直接使用;第二个是一个图标,使用前必须调用ToBitmap()方法将它转换为位图。
注意,代码需要从“资源”中请求图像,因此必须通过“添加资源”将图像添加到资源窗口。
当装载功能区时执行任务
使用Visual Studio创建的默认项目包括OnLoad()方法,当Office装载功能区时自动执行该方法。onLoad属性决定初始化时Office调用的方法,可以修改方法以满足需要,默认的方法名为onLoad()。本例中相应的回调代码为:
Public Sub Ribbon_Load(ByVal ribbonUI As Office.IRibbonUI) '保存Ribbon引用 Me.ribbon = ribbonUI '初始化下划线状态 UnderlineState = False '显示装载消息 MessageBox.Show("功能区装载") End Sub
本例提供了一个以某种方式工作的控件示例,该控件取决于用户对另一个控件的选择。本例中,用户能够控制是否应用程序允许下划线功能。因为Excel需要确定在Ribbon装载时该控件的状态,所以代码包含了一个名为UnderlineState的初始化变量。
在调试时,在代码中包括状态信息是有帮助的。这里,只是简单地告诉功能区已经装载。如果没有看到这个消息框,则表明加载项出现了错误。
创建新的选项卡、组和控件
最经常执行的任务之一是为应用程序创建新的选项卡、组和控件。为达到此目的,开始仍然需要添加XML。本例中,添加的XML代码如下:
<tab id="myTab" label="我的选项卡"> <group id="MyGroup" label="我的组"> <button id="myButton" label="我的按钮" image="Colorblk2" size="large" onAction="MyButton_ClickHandler"/> </group> </tab>
创建了一个名为“我的选项卡”的选项卡,包含一个名为“我的组”的组,其中含有一个名为“我的按钮”的按钮。使用了自定义图像,因此在image属性中添加了相应的信息。当用户单击“我的按钮”时,调用myButton_ClickHandler()方法:
Public Sub myButton_ClickHandler(ByVal Control As Office.IRibbonControl) ' 显示一条简单的消息 MessageBox.Show("我的按钮被单击") End Sub
修改或重利用已有的选项卡、组和控件
有时,希望修改或重利用已有的选项卡、组或控件,而不是创建新的。例如,可能想改变“格式刷”的功能,满足内在的格式需求,或者完全隐藏某些选项卡、组或控件。
下面的XML代码在“开始”选项卡中添加一个控件:
<tab idMso="TabHome"> <group id="BehaviorChange" label="操作" insertAfterMso="GroupFont"> <toggleButton id="StopUnderline" label="中止下划线功能" onAction="StopUnderline_ClickHandler" getPressed="StopUnderline_GetPressed" size="large" imageMso="ShapeFillColorPicker" insertBeforeMso="UnderlineGallery"/> </group> </tab>
在修改Office已有的元素时,使用idMso属性。新创建的“操作”组使用insertAfterMso属性指定该组在“开始”选项卡中的位置。
本例中,toggleButton控件除了需要通常的onAction属性外,还需要getPressed属性来获取按钮的状态。这两个属性对应的回调代码为:
Public Sub StopUnderline_ClickHandler(ByVal Control As Office.IRibbonControl, ByVal Pressed As Boolean) ' 存储当前按钮的状态 UnderlineState = Pressed ' 在屏幕上显示正确的状态 ribbon.InvalidateControl(Control.Id) End Sub Public Function StopUnderline_GetPressed(ByVal Control As Office.IRibbonControl) As Boolean ' 返回当前的按下状态 Return UnderlineState End Function
重利用现有的控件的处理过程与修改现有的控件不同。本例中,必须添加command元素:
<commands> <command idMso="Underline" onAction="myUnderline"/> <command idMso="FileSaveAsExcel97_2003" onAction="FileSaveAs_ClickHandler"/> </commands>
本示例重利用了两个控件:“开始”选项卡中的“下划线”按钮,以及“Office菜单”中“另存为”菜单的“Excel 97-2003工作簿”项目。本示例重载onAction属性,这是最常执行的重载。然而,应该看看其它需要的回调,例如处理切换按钮时的getPressed。
Public Sub myUnderline(ByVal Control As Office.IRibbonControl, ByVal Pressed As Boolean, ByRef CancelDefault As Boolean) ' 检查下划线控件的状态 If (UnderlineState) Then ' 显示错误消息 MessageBox.Show("没有允许操作的下划线") ' 设置控件使之不能被按下 Pressed = False ' 在屏幕上显示正确的状态 ribbon.InvalidateControl(Control.Id) ' 告诉Office不要执行默认的操作 CancelDefault = True Else ' 否则,告诉Office执行默认的操作 CancelDefault = False End If End Sub Public Sub FileSaveAs_ClickHandler(ByVal Control As Office.IRibbonControl, ByRef CancelDefault As Boolean) ' 包含用户的响应 Dim Response As DialogResult ' 要求用户保存文件 Response = _ MessageBox.Show("保存为老版本. 确定吗?", _ "老文件版本警告", _ MessageBoxButtons.YesNo) ' 检查响应 If Response = DialogResult.Yes Then CancelDefault = False Else CancelDefault = True End If End Sub
myUnderline()方法控制“下划线”控件是否按正常状态工作,还是基于用户是否按下“中止下划线功能”按钮而提供其它功能。正常状态工作时,该方法简单地设置CancelDefault为false,告诉Office执行缺省的操作。
此外,当用户按下“中止下划线功能”按钮时,该方法显示一条消息,说明下划线控件不工作了。然后设置Pressed为false,意味着下划线控件不会显示像它正常状态下按下时的操作。接着,重设控件为期望的设置。最后,设置CancelDefault为true。
修改或重利用Office菜单
Office菜单包含许多配置和文件项,不直接与具体操作相关。当希望创建与具体操作无关的项目时,将其添加到OfficeMenu项中。
<officeMenu> <menu idMso="FilePrepareMenu"> <button id="NewPrepButton" label="我的准备按钮" description="Prepare Time" image="TIME" insertBeforeMso="FileProperties" onAction="NewPrepButton_ClickHandler"/> </menu> <splitButton idMso="FileSaveAsMenu"> <menu idMso="FileSaveAsMenu"> <button id="SayHello" label="问好" description="This button says hello!" image="Colorblk2" onAction="SayHello_ClickHandler"/> </menu> </splitButton> </officeMenu>
上述代码演示了如何处理不同的控件,例如本例中的菜单和拆分按钮。相应的回调代码如下:
Public Sub NewPrepButton_ClickHandler(ByVal Control As Office.IRibbonControl) ' 显示一条简单的消息 MessageBox.Show("准备好了吗") End Sub Public Sub SayHello_ClickHandler(ByVal Control As Office.IRibbonControl) ' 显示一条简单的消息 MessageBox.Show("Hello") End Sub

使用startFromScratch模式创建功能区
要从头开始创建功能区,只需在ribbon元素中使用startFromScratch属性:
<ribbon startFromScratch="true">



你好,关注你的主页有些天了,感觉很不错! 似乎都是VB开发的, 我想请教一下,Excel 是否可以加载自己定义的Style(一个外部的文件);还有就是这个Style的格式是怎样的? 还一个问题就是,我想使用Office 2007 的内置图标,不知道可否方便将其发送一份到我 的邮箱 ! 谢谢, smqshao870@live.cn
版主:您好!
那如何“添加命名空间引用”呢?我昨天也将同样的问题发到您的这个邮箱(xhdsxfjy@163.com),不知是否您已收到?我的邮箱地址是:yyz5988@163.com.烦请您将您的源文件发给我.谢谢!
此外,个人宏工作簿我本来就是保存到个人宏工作簿中的,之前都会随着EXCEL文档自动打开的,只是从前天开始才出现这种情况的。可能是安装了什么插件,发生冲突!