高达游戏光盘:细品RibbonX(54):RibbonX和Visual Studio(2)

来源:百度文库 编辑:九乡新闻网 时间:2024/04/27 18:15:52
下面,让我们继续使用Visual Studio为功能区添加更多的功能。
  • 创建带有组和控件的新选项卡
  • 在现有的选项卡中添加新控件
  • 在Office菜单中添加新控件
  • 重利用现有选项卡中的控件
  • 重利用Office菜单中的控件

重利用是指将现有的控件实现新功能或者增强现有的功能。
在Visual Studio中处理图形
在使用Visual Studio时,必须提供图形作为加载项的一部分,这意味着要创建额外的代码。满足这项特定需求的XML作为customUI元素的一部分:

在代码中,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 ImageNameCase "Colorblk2"ThisBitmap = New Bitmap(My.Resources.Colorblk2)Case "TIME"ThisBitmap = New Bitmap(My.Resources.TIME.ToBitmap())End Select ' 返回简单的位图        Return ThisBitmapEnd 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代码如下:

      

创建了一个名为“我的选项卡”的选项卡,包含一个名为“我的组”的组,其中含有一个名为“我的按钮”的按钮。使用了自定义图像,因此在image属性中添加了相应的信息。当用户单击“我的按钮”时,调用myButton_ClickHandler()方法:

    Public Sub myButton_ClickHandler(ByVal Control As Office.IRibbonControl)' 显示一条简单的消息        MessageBox.Show("我的按钮被单击")End Sub

修改或重利用已有的选项卡、组和控件
有时,希望修改或重利用已有的选项卡、组或控件,而不是创建新的。例如,可能想改变“格式刷”的功能,满足内在的格式需求,或者完全隐藏某些选项卡、组或控件。
下面的XML代码在“开始”选项卡中添加一个控件:

      

在修改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 UnderlineStateEnd Function

重利用现有的控件的处理过程与修改现有的控件不同。本例中,必须添加command元素:

  

本示例重利用了两个控件:“开始”选项卡中的“下划线”按钮,以及“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 = TrueElse' 否则,告诉Office执行默认的操作            CancelDefault = FalseEnd IfEnd 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 ThenCancelDefault = FalseElseCancelDefault = TrueEnd IfEnd Sub

myUnderline()方法控制“下划线”控件是否按正常状态工作,还是基于用户是否按下“中止下划线功能”按钮而提供其它功能。正常状态工作时,该方法简单地设置CancelDefault为false,告诉Office执行缺省的操作。
此外,当用户按下“中止下划线功能”按钮时,该方法显示一条消息,说明下划线控件不工作了。然后设置Pressed为false,意味着下划线控件不会显示像它正常状态下按下时的操作。接着,重设控件为期望的设置。最后,设置CancelDefault为true。
修改或重利用Office菜单
Office菜单包含许多配置和文件项,不直接与具体操作相关。当希望创建与具体操作无关的项目时,将其添加到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属性: