Archive for 10月 2007

2007 Office Fluent Ribbon定制用户指南(连载7)

其它应用程序的Ribbon定制方案
考虑下面列举修改Fluent UI方式的方案,可以进行修改以满足您的需要。
注意:为了在下面的部分演示Ribbon定制的行为,可以使用在本指南前面介绍的技术,详见“2007 Office Fluent Ribbon定制用户指南(连载2)”。
(一) 创建自定义解决方案
到目前为止,您已看到修改已存在Ribbon的每个示例,可以从头开始创建整个UI。如果想创建自已的UI并在Ribbon中设置自已的自定义布局,则可以进行这样的操作。如果设置Ribbon元素的startFromScratch属性为True,则隐藏Ribbon所有的内容(这样不需要手工隐藏每个功能区元素)。当设置startFromScratch属性为True时,将产生下面的变化:

  • 隐藏所有已存在的Ribbon选项卡,包括加载项选项卡。
  • 修改“Office按钮”菜单,仅包括新建、打开、保存、应用程序选项和退出命令。

注意:可以在XML标记文件中指定想要隐藏Office菜单中的控件。必须在XML标记中明确地通过设置特定控件的Visible属性为False来请求这些更改。隐藏这些命令可能会将应用程序陷入不可恢复的状态,仅能通过关闭应用程序并卸载您的解决方案来解决。
设置startFromScratch属性不会对状态栏产生影响。
下面简单的XML标记使用startFromScratch属性来定制Fluent UI。
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui” >
  <ribbon startFromScratch=”true” >
    <tabs>
      <tab id=”CustomTab” label=”My Tab” >
        <group id=”SimpleControls” label=”My Group”>
          <toggleButton id=”ToggleButton1″
            size=”large” label=”Large Toggle Button”/>
          <button id=”Button2″ label=”My Button ” />
          <comboBox id=”Combo1″ label=”ComboBox”>
            <item id=”Month1″ label=”January” />
            <item id=”Month2″ label=”February” />
            <item id=”Month3″ label=”March” />
          </comboBox>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
这个示例隐藏Fluent UI中所有内置组件,并使用一个自定义选项卡、一个组和不同的控件来取代。
(二) 显示和隐藏选项卡
可以使用如下所示的示例标记来显示或隐藏内置选项卡或自定义选项卡。
<tab idMso=”TabHome” visible=”false” />
如果想要编程确定是否显示或隐藏选项卡(或其它元素),可以提供一个回调过程。也就是说,可以定义元素像下面的XML:
<tab idMso=”TabInsert” getVisible=”getVisibleCallback” />
接下来,在加载项或在VBA代码里,可以提供一个过程来返回Boolean值,指示是否该项目是可见的。例如,可以使用如下所示的代码在周末时隐藏Word 2007中的“插入”选项卡。
Public Sub getVisibleCallback(control As IRibbonControl, _
    ByRef visible As Variant)
    Select Case DatePart(”w”, Date)
        Case vbSaturday, vbSunday
            visible = False
        Case Else
            visible = True
    End Select
End Sub
(三) 显示和隐藏组
可以使用下面的示例代码(与以前示例中的回调过程一起使用)来显示或隐藏内置组或自定义组。
<tab idMso=”TabView”>
  <group idMso=”GroupDocumentViews” visible=”false” />
  <group id=”MyCustomGroup” label=”Custom Group”
    getVisible=”getVisibleCallback” />
</tab>
(四) 添加自定义选项卡
可以使用下面的代码来添加自定义选项卡。
<tab id=”CustomTab” label=”My Tab” />
(五) 添加带控件的自定义组
可以使用下面的示例代码添加一个自定义组,然后添加内置控件。
<group id=”CustomGroup” label=”My Group”>
   <toggleButton idMso=”Italic” />
   <toggleButton idMso=”Bold” />
   <button idMso=”FileSave” />
</group>
可以使用下面的代码添加自定义组,然后添加自定义控件。
<group id=”CustomGroup” >
   <toggleButton id=”MyToggleButton” size=”large”
     label=”Insert My Object”/>
   <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>
</group>
(六) 创建带嵌套菜单和控件的自定义菜单
可以使用下面的代码示例创建自定义菜单,然后添加嵌套的内置菜单和控件和自定义菜单和控件。这段标记也包括两个菜单分隔条。
<menu id=”MyMenu” label=”Test Menu” itemSize=”normal”>
   <toggleButton idMso=”Bold”/>
   <button id=”MenuButton1″ label=”Button1″ />
   <menuSeparator id=”separator1″/>
   <toggleButton id=”MenuToggleButton1″ label=”ToggleButton” />
   <button idMso=”FileExit”/>
   <menu id=”Nested1″ label=”Advanced” itemSize=”normal”>
      <button idMso=”Cut”/>
      <button idMso=”Copy”/>
      <button idMso=”Paste”/>
      <menuSeparator id=”separator2″ title=”Large Buttons Below”/>
        <menu id=”Nested2″ label=”Large” itemSize=”large”>
        <button idMso=”Cut”/>
         <button idMso=”Copy”/>
        <button idMso=”Paste”/>
      </menu>
   </menu>
</menu>
(七) 添加带嵌套项的组合框或下拉框
可以使用下面的代码示例来添加带项目的内置组合框控件(下拉控件使用相同的语法)。
<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>
(八) 添加带项目的自定义库控件
可以使用下面的代码示例添加带项目的库控件,然后添加自定义按钮控件。
<gallery id=”MonthGallery” imageMso=”DateAndTimeInsert”
  label=”Pick a Month:” columns=”3″ rows=”4″ onAction=”InsertMonth” >
  <item id=”Month1″ label=”January”/>
  <item id=”Month2″ label=”February”/>
  <item id=”Month3″ label=”March”/>
  <item id=”Month4″ label=”April”/>
  <item id=”Month5″ label=”May”/>
  <item id=”Month6″ label=”June”/>
  <item id=”Month7″ label=”July”/>
  <item id=”Month8″ label=”August”/>
  <item id=”Month9″ label=”September”/>
  <item id=”Month10″ label=”October”/>
  <item id=”Month11″ label=”November”/>
  <item id=”Month12″ label=”December”/>
  <button id=”InsertMonthButton”
    label=”Insert current month” onAction=”InsertCurrentMonth”/>
</gallery>
下面的VBA过程为库项目和库中的按钮提供了回调行为。

Sub InsertMonth(control As IRibbonControl, _
    selectedId As String, selectedIndex As Integer)
    

    Dim text As String
    Select Case control.ID
        Case “MonthGallery”
            text = MonthName(selectedIndex + 1)
    End Select
    Selection.InsertAfter text
End Sub

Sub InsertCurrentMonth(control As IRibbonControl)
    Select Case control.ID
        Case “InsertMonthButton”
            text = MonthName(DatePart(”m”, Date))
    End Select
    Selection.InsertAfter text
End Sub

注意:当定义库时,所有项目元素必须出现在任何按钮元素之前。
可以通过使用回调在运行时填充库控件。可以使用getItemCount回调来确定显示的项目数,getItemHeight和getItemWidth回调来获取库中项目的高度和宽度,getItemImage和getItemLabel回调来获取每个项目的图像和标签,getSelectedItemID或getSelectedItemIndex回调来获取所选的ID或索引值。
(九) 动态填充下拉列表
可以直到运行前都不知道在Ribbon控件中显示哪些项目,回调使得基于当前条件提供值成为可能。例如,可能想要显示文档标题列表,下面的示例演示如何提供当前文档标的列表。
包括下面的控件在Ribbon定制中。
<dropDown id=”HeadingsDropDown”
  getItemCount=”GetItemCount”
  getItemID=”GetItemID”
  getItemLabel=”GetItemLabel”/>
接下来,在代码中(在本例中Word文档的VBE模块里)添加下面的回调过程。
Sub GetItemCount(control As IRibbonControl, ByRef count)
    Dim varItems As Variant
    varItems = ActiveDocument.GetCrossReferenceItems(wdRefTypeHeading)
    count = UBound(varItems)
End Sub

Sub GetItemLabel(control As IRibbonControl, index As Integer, _
    ByRef label)
    Dim varItems As Variant
    varItems = ActiveDocument.GetCrossReferenceItems(wdRefTypeHeading)
    label = varItems(index + 1)
End Sub

Sub GetItemID(control As IRibbonControl, index As Integer, ByRef ID)
    ID = “heading” & index
End Sub
现在,当打开下拉列表时,将显示文档中所有的标题。
(十) 组合单个的控件
缺省情况下,Ribbon确定添加到组中的控件的位置。如果想要更精确地定义控件的布局,可以在一个或多个框里组合控件。当创建一个框时,指定其方向(水平的或垂直的)。一个组可以包含多个框,可以在框之间包括垂直分隔。(通过使用separator控件创建垂直分隔,仅用于垂直框。)
下面的示例创建三个组,一个使用水平框,一个使用垂直框,还有一个没有框,如下图所示。
<group id=”CustomGroup1″ label=”Horizontal Boxes”
   insertBeforeMso=”GroupClipboard”>
  <box id=”box1″ boxStyle=”horizontal”>
    <button id=”buttonA1″ label=”Button1″/>
    <button id=”buttonA2″ label=”Button2″/>
  </box>
  <box id=”box2″ boxStyle=”horizontal”>
    <button id=”buttonAA” label=”ButtonA”/>
    <button id=”buttonAB” label=”ButtonB”/>
    <button id=”buttonAC” label=”ButtonC”/>
  </box>
</group>
<group id=”CustomGroup2″ label=”Vertical Boxes”
   insertBeforeMso=”GroupClipboard”>
  <box id=”box3″ boxStyle=”vertical”>
    <button id=”buttonB1″ label=”Button1″/>
    <button id=”buttonB2″ label=”Button2″/>
  </box>
  <separator id=”separator2″/>
  <box id=”box4″ boxStyle=”vertical”>
    <button id=”buttonBA” label=”ButtonA”/>
    <button id=”buttonBB” label=”ButtonB”/>
    <button id=”buttonBC” label=”ButtonC”/>
  </box>
</group>
<group id=”CustomGroup3″ label=”No Boxes”
   insertBeforeMso=”GroupClipboard”>
  <button id=”buttonC1″ label=”Button1″/>
  <button id=”buttonC2″ label=”Button2″/>
  <button id=”buttonCA” label=”ButtonA”/>
  <button id=”buttonCB” label=”ButtonB”/>
  <button id=”buttonCC” label=”ButtonC”/>
</group>
DiffBoxModel
图:不同的框样式

自定义Office 2007用户界面的快速访问工具栏(QAT)

在2007 Microsoft Office Fluent用户界面中执行不同的操作,例如自定义快速访问工具栏,仅需要几行XML和编程代码。
概述
2007 Microsoft Office Fluent用户界面(UI) 使用更简单的系统代替了当前系统的层级菜单、工具栏和任务窗格,使得操作更有效率。Office Fluent Ribbon、快捷菜单、快速访问工具栏和Offce复选框是Office Fluent UI的所有组成部分。有很多自定义和内置的控件可以添加到Office Fluent Ribbon中,例如按钮、复选框和组合框。
通过使用XML标记元素,添加组件到Office Fluent Ribbon中,并且通过属性来设置那些组件中的属性。通过使用任何Microsoft Visual Studio 2005支持的编程语言,例如Visual Basic和Visual C#、以及VBA、Visual C++、Visual Basic 6.0来赋予这些组件的功能。
编写代码
可以使用XML和编程代码的组合来添加自已的自定义控件到Office Fluent Ribbon或执行其它在Office Fluent用户界面中的操作。
使用XML添加控件
XML提供了Office Fluent用户界面层级的、公开的模型。通过使用XML元素指定组件的类型,可以添加控件(例如按钮)到Ribbon或QAT。例如,可以使用button元素添加一个按钮,通过使用属性例如label属性给控件赋属性值。下面是用于自定义Office Fluent UI的XML的示例。
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui“>
  <ribbon startFromScratch=”true”>
    <qat>
      <sharedControls>
        <button idMso=”Copy” />
        <button idMso=”Paste” />
      </sharedControls>
    </qat>
  </ribbon>
</customUI>
该示例首先设置ribbon元素的startFromScratch属性为true,设置该属性使Office Fluent Ribbon在“start from scratch”模式下,隐藏了所有内置选项卡。接着,通过添加qat元素到代码中,创建对QAT的引用。然后,添加sharedControls元素封装QAT中任何自定义控件。最后,添加两个按钮,一个是内置的复制功能,一个是内置的粘贴功能。
通过使用idMso属性,可以告诉控件引用内置于Microsoft Office里的功能,包括Mso后缀的属性名称总是指向包含在Microsoft Office里的功能和资源。相反,使用id属性代表自定义控件。
有两种方式来自定义Office Fluent UI:
 修改通过支持Office Fluent UI的Office应用程序所创建的Office Open XML格式文件。
 使用加载项。
可以根据需要定制用户界面的作用来选择技术。例如,修改基于Office Open XML格式文件导致文档级的定制,所定制的Office Fluent Ribbon与特定的文档相关,而不是整个应用程序。而通过使用加载项,获取应用程序级的定制,这意味着定制的Ribbon将应用到整个应用程序中,而不管哪个文档打开。
使用Office Open XML格式文件创建定制的Ribbon
1、通过改变文件的扩展名,使之成为一个压缩文件(.zip),然后打开该文件。
2、添加一个包含XML定制代码的文件夹。
3、修改该文档相联系的文件来指向自定义文件夹。
4、改变该文档的扩展名。
5、在Office应用程序里打开该文档。
6、添加代码到文档中,提供自定义用户界面的功能。
使用加载项定制用户界面也简单。在创建加载项工程后,实现IRibbonExtensibility接口,包括Microsoft.Office.Core命名空间。该接口包含一个名为GetCustomUI方法,使用该方法返回XML定制代码。然后添加编程过程,提供自定义用户界面的功能。
自定义QAT
在下面的过程中,在Excel 2007中通过添加提供内置复制功能的按钮和内置粘贴功能的按钮来自定义QAT。
创建加载项解决方案
详见接下来的步骤。
创建添加自定义按钮到Ribbon中的加载项解决方案
1、开启Visual Studio 2005。
2、在“文件”菜单中,单击“新建项目”。
3、在“新建项目”对话框中,在“项目类型”窗格中,展开“其它项目类型”,单击“扩展性”,然后选择“共享的外接程序”。
4、在名称框中,输入RibbonDemo,然后单击“确定”创建项目。
5、在“共享外接程序向导”的第一页,选择“下一步”。
6、在“选择编程语言”页,选择Visual C#或Visual Basic,然后单击“下一步”。
7、在“选择应用程序主机”页,清除除Microsoft Excel外的所有选择,然后单击“下一步”。
8、在“输入名称和说明”页,输入项目的名称和说明,然后单击“下一步”。
9、在“选择外接程序选项”页,选择“我希望在加载宿主应用程序的同时加载我的外接程序”,然后单击“下一步”,然后单击“完成”。
Visual Studio创建了一个包含两个项目的解决方案——加载项本身和一个安装项。安装项可使得加载项能安装在其他用户的计算机中。这也使得您在设计时更容易安装和卸载加载项。
添加对项目的引用
要与Microsoft Office Excel 2007和Office Fluent Ribbon对象模型相交互,添加对Microsoft Office Core类型库的引用。
1、在解决方案管理器中,展开“引用”文件夹。
如果没有看到引用文件夹,则在“项目”菜单中单击“显示所有文件”。
2、删除Microsoft.Office.Core引用。
3、右键单击“引用”文件夹,然后单击“添加引用”。
4、单击“COM”选项卡,选择Microsoft Office 12.0 Object Library以及Microsoft Excel 12.0 Object Library,然后单击“确定”按钮。
5、在打开的代码文件顶部,添加下面的语句。
Imports Microsoft.Office.Core
Imports Excel = Microsoft.Office.Interop.Excel
创建定制的XML文件
创建定制的XML文件,添加组件。
1、在“项目”菜单中,单击“添加新项”。
2、在“添加新项”对话框中,选择XML文件,命名为Ribbon.xml,然后单击“添加”。
3、在XML文件中,添加上面给出的XML标记。
添加XML文件作为嵌入的资源
1、在解决方案管理器中,选择Ribbon.xml。
2、在属性窗口,选择“生成操作”属性,然后在选项列表中选择“嵌入的资源”。
3、在“项目”菜单中,单击“RibbonDemo属性”。
4、单击“资源”选项卡。
5、在解决方案管理器中,拖动Ribbon.xml到“资源”设计面板中。
这个操作创建了一个基于文件的资源。现在,Ribbon.xml文件自动存储为一个应用程序资源,可以通过使用Visual Basic或Visual C#语言来获取其内容。
6、关闭“资源”窗口。当出现提示时,单击“是”保存该资源。
访问宿主应用程序并处理用户界面
接下来,创建一个Excel实例,并添加对Ribbon扩展界面的引用。
1、在解决方案管理器中,右键单击“Connect.cs”或“Connect.vb”,然后单击“查看代码”。
2、找到已存在的applicationObject变量的声明,对其进行修改,指向一个Excel.Application对象,如下所示。
Private applicationObject As Excel.Application
3、修改OnConnection方法中已存在的第一行,创建Excel.Application对象的一个实例。
applicationObject = DirectCast(application, Excel.Application)
4、在Visual Basic中,修改代码行,在以Implements开始的类的顶部,添加实现IRibbonExtensibility命名空间的支持。Visual Basic自动插入GetCustomUI过程。
Implements Extensibility.IDTExtensibility2, IRibbonExtensibility
5、如果没有自动插入GetCustomUI过程,则手动插入该过程,其代码如下。
Public Function GetCustomUI(ByVal RibbonID As String) As String _
   Implements Microsoft.Office.Core.IRibbonExtensibility.GetCustomUI
   Return My.Resources.Ribbon
End Function
测试该项目
1、在“文件”菜单中,单击“全部保存”。
2、如果Excel 2007正运行,则退出。
3、在“生成”菜单中,单击“生成解决方案”。
4、在解决方案管理器中,右键单击“RibbonDemoSetup”,然后单击“生成”。
5、右键单击“RibbonDemoSetup”,然后单击“安装”。
出现RibbonDemo安装向导。
6、单击每一页中的“下一步”按钮,然后单击最后一页中的“关闭”按钮。
7、开启Excel 2007。
注意,因为设置startFromScratch属性为true,因此在Ribbon中没有选项卡(见图1)。同时,注意到显示的用户界面的“Office按钮”,且快速访问工具栏上包含有两个按钮。
customExcelRibbon1
图1:在Ribbon中没有显示任何选项卡
8、现在,在A1中输入一些文本,然后单击快速工具栏中的复制按钮。
9、接着,选择A3,单击快速访问工具栏中的粘贴按钮,则文本被粘贴到A3中,如图2所示。
testResult1
图2:从A1中复制文本并粘贴到A3中
10、退出Excel。
11、在Visual Studio的解决方案管理器中,右键单击“RibbonDemoSetup”,然后单击“卸载”。

2007 Office Fluent Ribbon定制用户指南(连载6)

为Access创建一个应用程序级的自定义Ribbon
(一) 创建一个Access应用程序级的自定义Ribbon

1、开启Access,打开一个已存在的数据库或创建一个新数据库。
2、单击“Office按钮”,单击“Access选项”,然后单击“高级”选项卡。
3、在“常规”部分,选择选项“显示加载项用户接口错误”(在不同的应用程序中,该选项可能在不同的位置)。
4、单击“确定”关闭Access选项对话框。
接下来,创建一个包含自定义XML标记的表。
5、在Access中,右键单击导航窗格,单击“导航选项”,选中“显示系统对象”前的复选框。(除非设置了该选项,否则将不可能在导航窗格中查看USysRibbons表。)单击“确定”按钮,Access系统表将出现在导航窗格中。
6、在“创建”选项卡中,单击“表设计”。
7、在表中添加下面的字段。
表:在USysRibbons表中定义的字段

字段名称 数据类型
ID 自动编号
RibbonName 文本
RibbonXml 备注

8、选择ID字段,在“设计”选项卡中选择“主键”。
9、单击“Office按钮”,然后单击“保存”,将新表命名为USysRibbons。
10、右键单击USysRibbons选项卡,然后单击“数据表视图”。
11、添加下面的数据到所创建的字段中。
表:USysRibbons表数据

字段名称
ID (自动编号)
RibbonName HideData
RibbonXml Xml

<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui“>
  <ribbon startFromScratch=”false”>
    <tabs>
      <tab idMso=”TabCreate” visible=”false” />
      <tab id=”dbCustomTab” label=”A Custom Tab” visible=”true”>
          <group id=”dbCustomGroup” label=”A Custom Group”>
              <control idMso=”Paste” label=”Built-in Paste” enabled=”true”/>
          </group>
       </tab>
     </tabs>
   </ribbon>
</customUI>
这段标记设置startfromScratch属性为False,然后隐藏内置的“创建”选项卡。接着,创建一个自定义选项卡和自定义组,并将内置的粘贴控件添加到组中。
12、关闭该表。
13、关闭并重新打开数据库。
14、单击“Office 按钮”,然后单击“Access选项”。
15、单击“当前数据库”选项卡,向下滚动到“功能区和工具栏选项”部分。
16、在“功能区名称”下拉列表中,选择“HideData”,单击“确定”按钮。
17、关闭并重新打开该数据库。
此时,“创建”选项卡已不在功能区中,Fluent UI包括了“A Custom Tab”选项卡,其中包含“A Custom Group”组,带有内置的“粘贴”按钮。
18、要恢复功能区,则需要打开“Access选项”对话框,删除“功能区名称”选项中的内容,然后关闭并重新打开数据库,此时Access将显示其缺省的Fluent UI。
注意:也可以从USysRibbons表中使用一个功能区,为指定的窗体或报表提供UI。要进行这样的操作,在设计或布局模式下打开窗体或报表,然后设置窗体的RibbonName属性为想要使用的Ribbon的名称。在设置该属性之前,必须选择窗体自身,而不是窗体中的任何控件或选择。
(二) 在运行时装载定制
如果想在运行时装载静态的定制,则将这些定制存储在USysRibbons表中,并且在需要时设置窗体或报表的RibbonName属性。但是,如果需要创建动态的定制,则调用Application.LoadCustomUI方法。下面的示例创建一个Ribbon定制,显示应用程序中每个窗体的按钮,处理每个按钮的onAction回调来装载请求的窗体。
创建动态的Ribbon定制
1、将前面内容中所使用的数据库装载到Access 2007中。如果数据库中只有一个窗体,则创建一个新窗体并在每个窗体中添加一至两个控件。
2、在“创建”选项卡中的“其他”组中,单击“宏”按钮的下拉列表,然后单击“模块”。
3、在VBE中的菜单“视图”中,单击“属性窗口”。
4、在“属性”窗口中,将名称(Name)属性框中模块的名称改为RibbonLoader。
5、在代码窗口中,输入下面的代码。虽然该方法不会返回值,但必须是一个函数,否则不能够从Access宏中调用。

Function CreateFormButtons()
  Dim xml As String
  xml = _
   “<customUI xmlns=”"http://schemas.microsoft.com/” & _
   “office/2006/01/customui”">” & vbCrLf & _
   “  <ribbon startFromScratch=”"false”">” & vbCrLf & _
   “    <tabs>” & vbCrLf & _
   “      <tab id=”"DemoTab”" label=”"LoadCustomUI Demo”">” & _
     vbCrLf & _
   “        <group id=”"loadFormsGroup”" label=”"Load Forms”">” & _
     vbCrLf & _
   “{0}” & vbCrLf & _
   “        </group>” & vbCrLf & _
   “      </tab>” & vbCrLf & _
   “    </tabs>” & vbCrLf & _
   “  </ribbon>” & vbCrLf & _
   “</customUI>”

  Dim template As String
  template = “<button id=”"load{0}Button”" ” & _
   “label=”"Load {0}”" onAction=”"HandleOnAction”" ” & _
   “tag=”"{0}”"/>” & vbCrLf
 
  Dim formContent As String
  Dim frm As AccessObject
  For Each frm In CurrentProject.AllForms
    formContent = formContent & _
     Replace(template, “{0}”, frm.Name)
  Next frm
 
  xml = Replace(xml, “{0}”, formContent)
  Debug.Print xml
  On Error Resume Next
  ‘ 如果从AutoExec宏中调用这段代码,
  ‘ 如果在USysRibbons表中有一个使用相同名称的定制
  ‘ 则会失败
  Application.LoadCustomUI “FormNames”, xml
End Function

当运行该段代码时,如果应用程序中包含有名为Form1和Form2的两个窗体,则会创建像下面的XML的标记。
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui“>
  <ribbon startFromScratch=”false”>
    <tabs>
      <tab id=”DemoTab” label=”LoadCustomUI Demo”>
        <group id=”loadFormsGroup” label=”Load Forms”>
            <button id=”loadForm2Button” label=”Load Form2″ onAction=”HandleOnAction” tag=”Form2″/>
            <button id=”loadForm1Button” label=”Load Form1″ onAction=”HandleOnAction” tag=”Form1″/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
这段标记创建了一个新的LoadCustomUI Demo选项卡,包含有一个“Load Forms”组。在该组内,Ribbon为应用程序中的每个窗体(Form1和Form2)显示一个按钮,并指定每个按钮在单击时应该调用的HandleOnAction回调过程。此外,该标记为每个按钮设置Tag属性,以便于代码应该打开的包含的Access窗体的名称。
6、添加下面的代码到相同的模块中。该过程提供回调行为,打开所选窗体并设置其RibbonName属性到FormNames Ribbon定制。
Public Sub HandleOnAction(control As IRibbonControl)
    ‘ 装载指定的窗体
    ‘ 设置其RibbonName属性以便显示自定义UI.
    DoCmd.OpenForm control.Tag
    Forms(control.Tag).RibbonName = “FormNames”
End Sub
7、保存该数据库,关闭VBE。
8、如果应用程序只包含一个窗体,则创建窗体使得应用程序至少包含两个窗体。
9、确定应用程序的开启窗体,并且在设计视图中打开该窗体。
10、在属性窗口里的事件选项卡中,找到onLoad事件属性,单击属性值右侧的省略号(…)按钮,选择选项列表中的“代码生成器”,然后单击“确定”。(如果没有看到属性窗口,在设计选项卡中单击“属性表”。)
11、在VBE中,修改Form_Load过程,其代码如下所示。
Private Sub Form_Load()
    CreateFormButtons
    Me.RibbonName = “FormNames”
End Sub
12、在菜单“工具”中,单击“引用”,选择“Microsoft Office 12.0 Object Library”(需要对该对象库的引用来使用IRibbonControl类),然后单击“确定”。
13、保存该数据库,关闭VBE。
14、单击“Office按钮”,然后单击“Access选项”。
15、单击“当前数据库”选项卡。
16、在应用程序选项部分,从窗体的显示窗体列表中选择启动窗体,然后单击“确定”。
17、关闭并重新打开该数据库。
启动窗体打开,带有包含显示应用程序里每个窗体的按钮组的自定义选项卡。单击任何一个按钮,Access打开相应的窗体,保持相同的自定义UI。
除了已介绍的技术外,可以通过使用COM加载项添加Ribbon定制到Access中。COM加载项提供添加自定义RibbonX功能作为组件包的好处,而不需要在每个应用程序中添加VBA代码。在Access中执行加载项就像在其它Office应用程序中一样。
注意:虽然可以使用Visual Studio 2005共享加载项模板为Access创建一个COM加载项,但不能够使用 Visual Studio 2005 Tools for Office Second Edition来为Access创建COM加载项。Access是Visual Studio 2005 Tools for Office Second Edition不支持的应用程序之一。

使用VSTO在Excel 2007中添加自定义任务窗格

使用VSTO 2005,可以为Excel 2007添加自定义任务窗格,下面介绍具体的步骤。
步骤1:开启Visual Studio 2005,新建一个项目,展开Office节点并选择“2007 外接程序”,在右侧的模板中选择“Excel 外接程序”,在名称框中输入项目的名称,例如“CustomExcelPane”,如图1所示。单击“确定”按钮。
NewItem1
图1:新建外接程序项目
步骤2:在菜单“项目”中,单击“添加用户控件”,出现的“添加新项”对话框。
步骤3:在该对话框的名称框中,输入“MyUserControl”,然后单击“添加”按钮,如图2所示。
AddNewItem1
图2:添加新的用户控件
步骤4:从“工具箱”将一个或多个Windows窗体控件拖动到在新添加的控件中,如图3所示。
AddControl1
图3:在新用户控件中添加Windows窗体控件
步骤5:双击解决方案管理器中的“ThisAddIn.vb”,打开其代码窗口。
步骤6:向ThisAddIn类中添加代码:
Private myUserControl1 As MyUserControl
该代码将MyUserControl的一个实例声明为ThisAddIn的成员。
步骤7:在ThisAddIn_Startup事件处理程序中添加下面的代码:
myUserControl1 = New MyUserControl
        Dim myCustomTaskPane As Microsoft.Office.Tools.CustomTaskPane = _
            Me.CustomTaskPanes.Add(myUserControl1, “我的任务窗格”)
        myCustomTaskPane.Visible = True
这些代码将MyUserControl对象添加到CustomTaskPanes集合并显示自定义任务窗格。
步骤8:运行代码,将打开Excel 2007,其界面右侧将显示自定义的任务窗格;或者编译该代码并保存后,打开Excel 2007,此时在其界面右侧将自动显示自定义的任务窗格。如图4所示。
customPane1
图4:自定义的任务窗格

2007 Office Fluent Ribbon定制用户指南(连载5)

Access 2007中的UI定制
Access 2007中RibbonX定制在一些方面与其它Office应用程序定制的方法相同,但有一些重要的不同。与其它的应用程序一样,通过使用XML标记来自定义Access中的Fluent UI,可以使用包含XML标记或COM加载项的外部文件整合Ribbon定制到应用程序中。然而,与其它Office应用程序不同的是,因为Access数据库文件是二进制的并且不能作为Office Open XML格式文件打开,不能通过添加部件到数据库文件中来自定义Access Ribbon。
在自定义Fluent UI方面,Access是灵活的。例如,定制标记可以存储在表中、嵌入到VBA过程中、存储在其它的Access数据库中、或者从Excel工作表中链接。也可以为整个应用程序指定自定义UI,也可以只指定窗体和报表。
下面介绍如何自定义Access UI。
注意:因为所介绍的内容将修改数据库,因此应在非正式的数据库中执行这些步骤,或者使用示例数据库的副本。
(一) 在Access中自定义Fluent UI
在自定义Access UI时,有两种选择:可以将定制存储在特定的表中并使Access自动装载标记,或者可以将定制存储在您选取的位置并通过调用Application.LoadCustomUI方法手动装载该标记。
如果选择让Access装载定制,则需要将它们存储在名为USysRibbons的表中。该表至少有两列:一个255个字符的名为RibbonName的Text列和一个名为RibbonXML的Memo列。将Ribbon名称放置在RibbonName列中,将Ribbon标记放置在RibbonXML列中。关闭并重新打开该数据库后,在Access的属性对话框中选择默认的Ribbon来使用。当所选择的任何窗体或报表作为其属性时,可以选择显现的Ribbon。
如果决定使用更动态的技术,可以调用LoadCustomUI方法,它装载Ribbon定制而不管是否XML内容被存储在表中。通过调用LoadCustomUI装载定制之后,可以编程在运行时赋值所命名的定制。
注意:通过使用LoadCustomUI方法装载的定制仅在数据库开启时可用。每次打开数据库时必需调用LoadCustomUI。在需要运行时编程赋值自定义UI时,该技术是有用的。
LoadCustomUI方法的签名如下:
Expression.LoadCustomUI(CustomUIName As String,CustomUIXML As String)
Expression返回一个Application对象。
CustomUIName是与该标记相联系的自定义Ribbon ID的名称。
CustomUIXML包含XML定制标记。
使用LoadCustomUI方法的示例参见本指南后面的部分。
下面的过程以一种概括的方式描述如何在Access中添加应用程序级的定制,稍后提供完整的介绍。
(二) 在设计时应用定制的应用程序级Ribbon
1、创建一个名为USysRibbons的表,其中包含前面所描述的列,为想要的每个不同的Ribbon添加行。
2、关闭并重新装载数据库。
3、单击“Office按钮”,然后单击“Access选项”。
4、在“功能区和工具栏选项”中单击“当前数据库”选项,单击“Ribbon名称”下拉列表,并单击其中的一个Ribbon。
要移除一个已存在的定制(以便数据库使用默认的Fluent UI),则从Ribbon名称列表中删除已存在的Ribbon名称,并使该Ribbon的名称为空值。
下面的过程以一种概括的方式描述如何在Access中添加窗体级的定制或报表级的定制。
(三) 赋一个指定的自定义Ribbon到窗体或报表中
1、下面的过程介绍通过添加先前的USysRibbons表使自定义Ribbon对应用程序可用。
2、在设计视图下打开窗体或报表。
3、在“设计”选项卡中,单击“属性表”。
4、在“属性”窗口里,在“其它”选项卡中,单击“Ribbon名称”下拉列表,然后单击其中一个Ribbon。
5、保存并关闭,然后重新打开该窗体或报表,则将显示所选择的UI。
注意:显示在Fluent UI中的选项卡是附加的,也就是说,除非明确地隐藏选项卡或设置StartFromScratch属性为True,除了已存在的选项卡外,还将显示在窗体或报表的UI中的选项卡。
要进一步研究这个过程,详见随后的示例。
这个示例的第一部分设置一个选项,报告装载自定义UI时已存在的任何错误。(虽然您是在Access中执行这些步骤,但您也可以在其它的应用程序中执行相似的步骤)