在Office 2007用户界面中添加自定义组合框

编者注:在阅读本文前,您应先阅读过“在Office 2007用户界面中添加自定义按钮”和“自定义Office 2007用户界面的快速访问工具栏”两篇文章,并熟悉其中的操作步骤。本文主要提供自定义的XML代码和回调过程代码,以及相应的说明。
可以使用XML和编程代码相结合,在Ribbon中添加自已的自定义组合框(comboBoxes),或者重复使用一些内置组合框。
用于添加控件的XML
可以使用comboBox元素来添加单个的组合框,通过使用属性如label属性来给组合框赋属性值。下面是代码:
<?xml version=”1.0″ encoding=”utf-8″ ?>
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui” loadImage=”LoadImage” >
   <ribbon startFromScratch=”false”>
      <tabs>
         <tab id=”tab1″ label=”ComboBox Demo” keytip=”z” >
            <group id=”group1″ label=”Demo Group”>
               <comboBox id=”comboBox1″
                  enabled=”true”
                  getText=”GetText”
                  getLabel=”GetLabel”
                  image=”camera.bmp”
                  getShowLabel=”GetShowLabel”
                  getShowImage=”GetShowImage”
                  getScreentip=”GetScreentip”
                  supertip=”This is a supertip for the combo box.”
                  keytip=”A1″
                  visible=”true”
                  getItemCount=”GetItemCount”
                  getItemLabel=”GetItemLabel”
                  getItemImage=”GetItemImage”
                  getItemScreentip=”GetItemScreentip”
                  getItemSupertip=”GetItemSupertip”
                  onChange=”OnChange” />
               <comboBox id=”comboBox2″
                  label=”Insert More Text.”
                  getText=”GetText”
                  imageMso=”TableDrawTable” />
            </group>
         </tab>
      </tabs>
   </ribbon>
</customUI>
通过赋予tab元素的label属性文本,本示例在Office Fluent Ribbon中添加标题为ComboBox Demo的自定义选项卡。该选项卡包含Demo Group组,组中包含两个名为comboBox1和comboBox2的自定义组合框。这些复选框通过visible属性、enabled属性和label属性等来定义其属性。可以通过设置该属性相对应的字符串,明确地给这些属性赋值,例如supertip属性,或者直接地指向编程代码过程。
现在来看看这段示例代码。enabled属性被设置为Ture,使得该组合框可用。当设置其为False时,该控件变灰,表明该组合框处于非活动状态。接下来的getText属性指向一个回调过程,来定义在开始显示时组合框里显示的文本。
getLabel属性也指向一个回调过程,返回显示在组合框中的标签。接着,comboBox1的image属性指定该组合框的自定义图像。同样,comboBox2的imageMso属性为该组合框指定内置的图像。
可以使用image和imageMso属性与customUI元素的loadImage属性一起作用。当使用image属性指定一个图像时,将调用loadImage回调过程来装载图像,然后,在Ribbon中显示该图像。
Public Function LoadImage(ByVal imageName As String) As Bitmap
    Dim assembly As Assembly = Assembly.GetExecutingAssembly()
    Dim stream As Stream = assembly.GetManifestResourceStream(”CodeSnippetTester.” & imageName)

    Return New Bitmap(stream)
End Function

在这个过程中,一个位图(bitmap)图像被返回到Microsoft Office。当调用该过程时,该图像作为一个集成的资源被获取并赋给Stream对象。最后,该图像作为Bitmap对象来返回。
getShowLabel属性和getShowImage属性指向涉及到Boolean值的回调过程。例如,设置getShowLabel属性为True导致在显示该控件时显示组合框的标签。如果想明确地设置属性的值,使用showLabel属性。
接下来,看看getScreentip属性。屏幕提示是在鼠标指针移动到Office Fluent Ribbon中某项目上时出现的小框,提供了所选对象的简单的上下文相关信息。同样,supertip属性(如果指向某回调过程,则为getSupertip属性)提供了关于该对象额外的信息。
另外对于getScreentip属性和supertip属性要注意的是,无论何时看到带get前缀的属性,该属性指向一个回调过程。因此,在代码中,getScreentip属性指向名为GetScreentip的回调过程。
注:回调过程的名称不一定与使用的属性名称相同。指向回调过程的属性也不一定在其前面都有get,例如在上面的XML代码中,onChange属性指向名为OnChange的回调过程。
supertip属性代表了控件属性的另一方面。一个没有get前缀的属性表示可以明确地给其赋文本值。在supertip属性的情形下,直接赋文本值取代了回调过程。也有例外,如onAction属性,该属性没有前缀get。
keytip属性为组合框赋予按键提示(KeyTip)。按键提示有时称作访问键或加速键,按键提示表明当使用键盘访问系统时,在访问程序功能时按下的键。要在自定义选项卡控件中使用按键提示,首先为选项卡设置按键提示,或者使用Microsoft Office赋予的缺省的按键提示。然后,为该控件赋予按键提示。例如,在代码中,选项卡有一个等于z的按键提示,comboBox1组合框有一个按键提示等于A1。当Office Fluent Ribbon显示时,按下Alt键来显示选项卡的按键提示。然后,按下z键使自定义选项卡获取焦点。最后,按下A+1组合键来激活该组合框。
再看上面的XML代码,设置visible属性为Boolean值确定是否在Ribbon中显示该组合框。接下来的一些属性指向组合框的下拉列表的项目。例如,getItemCount属性返回在用户单击组合框时下拉列表中的项目数。getItemLabel和getItemImage属性执行与getLabel和getImage属性类似的功能。getItemScreentip和getItemSupertip属性指定下拉项目的屏幕提示和增强提示(supertips)。
最后,onChange属性指向一个回调过程,当单击该组合框里某项目时执行此过程。
对Ribbon组件分配功能
在前面的XML示例中,一些属性指向回调过程。例如,comboBox元素有onChange属性,当单击该组合框时,调用OnChange方法或者回调过程。在OnChange方法中的代码为组合框提供功能。这些过程被称为回调,因为当单击该组合框的下拉列表里的项目时,该操作通知Microsoft Office需要注意该控件。然后,Microsoft Office调用返回通过OnChange属性定义的方法,并执行包含在方法中的操作。下面介绍这些回调过程。
getText属性指向GetText回调过程,指定在初始显示控件时显示在组合框中显示的文本。
Public Function GetText(ByVal control As IRibbonControl) As String
    Select Case control.ID
        Case “comboBox1″: strText = “Camera”
        Case “comboBox2″: strText = “Video”
    End Select
    Return strText
End Function

当Microsoft Office调用GetText过程时,IRibbonControl对象代表所传递的组合框。该过程测试对象的Id属性,根据所获取的值,赋文本值给变量。然后将该变量返回到Microsoft Office,显示其文本作为组合框里的缺省文本。
getLabel属性调用GetLabel回调过程。
Public Function GetLabel(ByVal control As IRibbonControl) As String
    Dim strLabel As String = “”
    Select Case control.ID
        Case “combo box1″: strLabel = “Insert text.”
        Case “combo box2″: strLabel = “Insert more text.”
    End Select
    Return strLabel
End Function

与GetText回调过程相似,当通过Microsoft Office调用GetLabel过程时,传递一个代表组合框的IRibbonControl对象。该过程测试该对象的Id属性,根据其值,赋文本值给变量。然后该变量返回给Microsoft Office,显示其文本作为组合框的标签。
getShowLabel和getShowImage回调过程返回一个Boolean值,指定当显示自定义选项卡时是否显示各自的对象(一个标签或一个图像)。
Public Function GetShowImage(ByVal control As IRibbonControl) As Boolean
    Return True
End Function

Public Function GetShowLabel(ByVal control As IRibbonControl) As Boolean
    Select Case (control.ID)
        Case “comboBox1″ : Return True
        Case “comboBox2″ : Return False
    End Select
End Function
在GetShowLabel过程中,测试控件的Id属性,并根据其值,设置boolean变量为true或false。然后返回该变量到Microsoft Office。
getScreentip属性也指向一个回调过程。在本例中,该过程返回一个字符串,当鼠标移动到组合框上时,显示该字符串。
Public Function GetScreenTip(ByVal control As IRibbonControl) As String
    Return “Inserts text into the active worksheet.”
End Function

getItemCount回调过程返回一个整数值,指定在显示自定义选项卡时是否显示各自的对象(相标签或图像)。
Public Function GetItemCount(ByVal control As IRibbonControl) As Integer
    Return 3
End Function
接下来,getItemImage属性指向GetItemImage回调过程。
Public Function GetItemImage(ByVal control As IRibbonControl, ByVal itemIndex As Integer) As Bitmap
    Dim imageName As String
    Select Case (itemIndex)
        Case 0: imageName = “camera.bmp”
        Case 1: imageName = “video.bmp”
        Case 2: imageName = “mp3device.bmp”
    End Select

    Dim assembly As Assembly = Assembly.GetExecutingAssembly()
    Dim stream As Stream = assembly.GetManifestResourceStream(”CodeSnippetTester.” & imageName)

    Return New Bitmap(stream)
End Function
在该过程中,一个位图图像被返回到Microsoft Offie。当该过程被调用时,图像赋值给一个变量。然后,作为一个集成的资源流获取该图像文件,并赋给一个Stream对象。最后,作为Bitmap对象返回该图像。
接下来,当单击组合框中的某项目时,调用OnChange回调过程。在本例中,该过程测试正调用控件的Id属性,并插入该控件指定的文本到工作表的A1单元格中。
Public Sub OnChange(ByVal control As IRibbonControl, ByVal text As String)
    applicationObject.Range(”A1″).Value = _
      ”You selected ” & text
End Sub
实现Ribbon定制
参照“在Office 2007用户界面中添加自定义按钮”一文中的步骤,使用Visual Studio 2005整合上述XML和回调过程。
很遗憾,经过调试,本程序未实现最终的效果。除了上文中要添加的引用外,还添加了对NET选项卡中System.Drawing的引用,在代码顶部添加了:
Imports System.Drawing
Imports System.Reflection
Imports System.IO
相应修改了部分程序代码,但最终结果未实现。所产生的结果见下图:
result6
本文与前面的系列文章一样,均整理自MSDN,本文中未实现的内容只好留待以后进一步研究了,如果有朋友找到了其中的错误,请指正!


提示:您可以在评论中使用HTML标签,且任何与HTML标签相同的符号都会被理解为HTML标签并以相应的格式显示.如果您的评论中有代码,可以使用相应的标签,例如,如果有VB或VBA代码,则可以使用[vb]标签,即[vb]放置的代码[/vb],这样会很清晰地显示代码.

留下回复