楼主 gouweicao78 |
在前面的一系列关于RibbonX的介绍中,我们一起认识了Office 2007的功能区界面,了解了RibbonX开发的基础知识,介绍了一些有用的资源,并重点讲解了RibbonX开发的工具以及步骤,关键的XML知识和回调基础。下面,我们以问答的形式对前面的一些主要知识进行小结。 问题1 没有任何第三方工具,我如何创建自定义的选项卡? 如果有第三方工具辅助,例如Custom UI Editor,那么自定义功能区是很方便的。不过没有也不要紧,只是稍微复杂一点罢了。 步骤1 打开Excel,输入数据后,使用xlsm扩展名保存该文件。 确保使用xlsm扩展名保存Excel文件,否则Excel会去除包含宏的文件。 步骤2 关闭Excel,然后在Windows中打开保存该文件的文件夹。 步骤3 在该文件夹中创建一个名为customUI的新文件夹。 步骤4 在这个新文件夹中添加一个名为customUI.xml的新文本文件。记住,该文本文件的扩展名为xml。 在customUI.xml文件中添加自定义选项卡的XML代码: <?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes” ?> <customUI xmlns=” <ribbon> <tabs> <tab id=”myTab” label=”我的选项卡” keytip=”MT”> </tab> </tabs> </ribbon> </customUI> 说明:上述代码中有一个keytip属性,代表用户按Alt键时选项卡出现的提示键,即用户按Alt+MT键就可以选择自定义的选项卡。在定义提示键时,选择的字符应避免与相同级别已有的提示键相冲突,例如,每个选项卡必须有唯一的提示键,然而其中的控件可以与选项卡有相同的提示键,只要它不与其它控件的提示键相同。 步骤5 将刚创建的Excel文件的扩展名改为ZIP。 步骤6 从ZIP文件中提取_rels文件夹,并修改其中的.rels文件,用于告诉Excel存在customUI.xml文件。在.rels文件中添加下面的代码: <Relationship Id=”rId4″ Type=” 必须提供唯一的Id属性值。Type属性必须指向自定义用户界面扩展的架构,因此使用如代码中显示的URL。Target属性指向自定义文件的位置。 步骤7 将_rels文件夹放回到ZIP文件中。 步骤8 将customUI文件夹放到ZIP文件中。 步骤9 将ZIP文件的扩展名修改回Excel的扩展名。 此时,打开Excel文件后,将看到如下图1所示的自定义选项卡。该选项卡是空的,因为我们还没有在其中添加任何的组。注意,该选项卡显示了MT提示键。 图1:添加空白选项卡 问题2 如何在选项卡中添加组? 在上文中,我们已经创建了一个新的选项卡。那么,在该选项卡中添加组也是相当容易的,只需要修改customUI.xml文件。此时,首先应该设计好布局,然后再添加相应的VBA代码。 下面是修改后在customUI.xml文件中添加的xml代码: <tab id=”myTab” label=”我的选项卡” keytip=”MT”> <group id=”Default” label=”默认组“> </group> <group id=”SeparatorGroup” label=”使用分隔条的组“> <separator id=”SeparatorItem” visible=”true” /> </group> <group id=”DialogBoxLaunch” label=”使用对话框启动器的组“> <dialogBoxLauncher> <button id=”LaunchDialog” screentip=”对话框启动器“ supertip=”单击此按钮通常会显示一个对话框.” keytip=”LD” /> </dialogBoxLauncher> </group> </tab> 上述代码在选项卡中添加了三个组。按上文所述步骤,将修改后的customUI.xml文件替换ZIP文件夹中原来的customUI.xml文件,然后将ZIP文件扩展名修改回xlsm扩展名,打开Excel文件,结果如下图2所示。 图2:添加了三个组的选项卡 下面我们对上述代码进行简单的说明。 上述代码以标准的组开始,没有包括任何特定的功能。通常,可以在<group>和</group>标签之间放置控件。组能够使用下列属性: l image(添加图像到组中) l imageMso(添加内置图像到组中) l keytip(为组提供加速键) l screentip(为使用组显示一条简短的提示) l supertip(为使用组显示一条较详细的提示) 然而,在通常情况下,我们不会使用这些额外的属性。事实上,由于组本身的特点,即使设置了这些属性,相应的特点可能也不会反映到界面中,因为Office忽略了这些属性。 除了在组中放置控件外,还有两个额外的子元素。<separator>元素在组中放置一条分隔条,提供控件之间的分隔,例如“视图”选项卡中的一些组,为我们提供了如何放置分隔条以提供更好的外观的示例。 一些组中还包括有对话框启动器,单击它将提供更多的功能。如上述代码所示,使用<dialogBoxLauncher>元素来提供对话框启动器。<dialogBoxLauncher>元素需要包括<button>控件,否则Office不会显示,并且<dialogBoxLauncher>元素必须包含一个且唯一一个<button>控件,不能使用任何其它的控件。 问题3 使用记事本定制Ribbon太麻烦且易出错,有没有第三方工具可以简化定制Ribbon的过程? 有。包括一款名为Office 2007 Custom UI Editor的工具和XML NotePad的工具,此外,还可以使用Visual Studio 2008来定制Ribbon。 问题4 Office 2007 Custom UI Editor是什么? Office 2007 Custom UI Editor是一款小巧的用于自定义Office功能区的工具,使用该工具非常方便。不仅可以直接输入代码,还可以验证代码、添加图像,产生回调。但遗憾的是,不支持中文。 问题5 如何使用Office 2007 Custom UI Editor自定义功能区? 使用Office 2007 Custom UI Editor创建自定义功能区非常简单。仍以上述代码为例,简要地介绍其步骤: 步骤1 创建需要自定义功能区的Excel文件并保存。 步骤2 关闭Excel文件。 注意,在使用Custom UI Editor自定义功能区之前,必须首先关闭相应的Excel文件。 步骤3 打开Custom UI Editor。 步骤4 在Custom UI Editor中打开Excel文件。 步骤5 编写xml代码。 图3:在CustomUIEditor中输入代码 步骤6 保存并关闭Custom UI Editor 步骤7 打开Excel文件。此时,将出现自定义的功能区元素。 问题6 我要在Office 2007中开发中文的选项卡和组,如何进行? 可以采取使用记事本的方法,只不过在保存xml文件时,选择utf-8格式。 问题7 在哪里可以获取Office图标? 您可以从Microsoft的网站上搜索Office2007IconsGallery.EXE,下载该文件后安装。然后找到Office2007IconsGallery.xlsm文件并打开,此时在“开发工具”选项卡中将包含一个Office图标组,可以确定所有内置图标的名字。 您也可以从下列站点获得: http://www.excelperfect.com/wordpress/2009/05/06/ribbonxstudy8/ 问题8 如何获取控件的标识符 Microsoft提供了一种简单的方法很容易获得控件的标识符名。单击“Office按钮——选项”,调出应用程序选项对话框。在该对话框中,选择“自定义”选项卡。在“从下列位置选择命令”组合框中选择,然后将鼠标悬浮在下方列表框中的某个命名上,即可显示其标识符。然而,这仅对控件有用,如果需要知道选项卡和组的标识符,应在Microsoft的网站上下载专门的文档。 问题9 如何添加自定义功能? 在使用XML自定义功能区后,除了使用内置控件或者希望利用内置控件的功能外,还可以添加自定义功能。这需要使用回调,即使自定义的界面工作的VBA代码。 (1)为含有组和控件的选项卡编写VBA代码 最常见的任务之一是创建带有组和控件的选项卡,以添加自定义的功能。下面介绍如何处理“My Tab”选项卡的“My Group”组中名为“My Button”的按钮。 步骤1 在Custom UI Editor中编写XML <?xml version=“1.0“ encoding=“UTF-8“ standalone=“yes“?> <customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“> <ribbon> <tabs> <tab id=“myTab“ label=“My Tab“> <group id=“myGroup“ label=“My Group“> <button id=“myButton“ label=“My Button“ image=“Colorblk2“ size=“large“ onAction=“myButton_ClickHandler“/> </group> </tab> </tabs> </ribbon> </customUI>步骤2 插入图标 单击“Insert Icons”按钮,插入名为Colorblk2的图标。这里,使用的是自定义图像,因此使用image属性。 步骤3 生成回调代码 单击“Generate Callbacks”按钮,生成回调代码: ‘Callback for myButton onAction Sub myButton_ClickHandler(control as IRibbonControl) End Sub 复制该段代码,并关闭Custom UI Editor。 步骤4 编写VBA代码 打开工作簿,切换到VBE,插入一个新模块,并粘贴代码。然后,在其中编写要实现的功能的代码。最后的代码如下: ‘Callback for myButton onAction Sub myButton_ClickHandler(control As IRibbonControl) MsgBox control.ID + “被单击.” End Sub 此时,保存Excel文件,切换到“My Tab”选项卡,单击“My Button”按钮,会出现包含该按钮标识符信息的消息框,如图4所示。 图4:单击自定义的按钮后执行相应的VBA代码的结果 (2)修改已有的选项卡、组和控件 只要知道相应的标识符,我们就能够修改已有的选项卡、组和控件。下面,首先在现有的选项卡中添加一个新组和控件,然后实现该控件的自定义操作。 在现有的选项卡中添加新组和控件的XML如下: <tab idMso=“TabHome“> <group id=“BehaviorChange“ label=“Behavior“ insertAfterMso=“GroupFont“> <toggleButton id=“StopUnderline“ label=“Stop Underlining“ onAction=“StopUnderline_ClickHandler“ getPressed=“StopUnderline_GetPressed“ size=“large“ imageMso=“ShapeFillColorPicker“ insertBeforeMso=“UnderlineGallery“/> </group> </tab>从上述代码可知,新组出现在“开始”选项卡中,其名称为“Behavior”,并且将该组插入到“字体”组之后,该组中包含一个大尺寸的切换按钮。必须为该切换按钮提供两个回调:onAction和getPressed。在单击切换按钮时,onAction回调执行与标准按钮相同的任务,而getPressed回调记录切换按钮的状态。该切换按钮使用了Office提供的图标。 界面如下图5所示: 图5:在“开始”选项卡中添加新组和控件 (注意,在Custom UI Editor生成的回调中,不总是提供正确的参数,例如OnAction回调,其正确的参数为: Sub OnAction(control as IRibbonControl,pressed as Boolean,ByRef fCancelDefault) 可以参考: http://msdn2.microsoft.com/en-us/library/ms406047.aspx) 下面的XML用于重利用“下划线”按钮: <commands> <command idMso=“Underline“ onAction=“myUnderline“/> </commands>接着,在Custom UI Editor中生成回调代码并复制到VBE中,添加代码如下: ‘Define a global variable to hold the Ribbon reference. Dim Rib As IRibbonUI ‘Determines the behavior button state. Dim lBehavior As Boolean ‘Callback for customUI.onLoad Sub RibbonLoaded(ribbon As IRibbonUI) ‘Save the ribbon reference. Set Rib = ribbon ‘Initialize the behavior state. lBehavior = False ‘Tell the user the Ribbon is loaded. MsgBox “Ribbon Loaded” End Sub ‘Callback for myUnderline onAction Sub myUnderline(control As IRibbonControl, pressed As Boolean, ByRef fCancelDefault) If (lBehavior) Then MsgBox “No Underlined Allowed!” pressed = False fCancelDefault = True Else fCancelDefault = False End If End Sub ‘Callback for StopUnderline onAction Sub StopUnderline_ClickHandler(control As IRibbonControl, pressed As Boolean) ‘ Change the behavior state. lBehavior = pressed ‘ Update the control. Rib.InvalidateControl (control.ID) End Sub ‘Callback for StopUnderline getPressed Sub StopUnderline_GetPressed(control As IRibbonControl, ByRef returnedVal) ‘ Return the current behavior state. returnedVal = lBehavior End Sub 上述代码在开始部分定义了一个变量来追踪应用程序的状态,以确保添加的控件反映正确的状态。StopUnderline_ClickHandler()过程接受当前的控件及其按下的状态,代码在lBehavior中存储该控件的状态,然后使用InvalidateControl()重绘。通过返回lBehavior到功能区,StopUnderline_GetPressed()过程执行显示当前切换按钮状态的处理。由于首次装载文档时功能区调用该过程,因此必须在RibbonLoaded()中提供lBehavior的默认值。本例中,当lBehavior为False时,myUnderline()执行默认的行为。当用户设置Stop Underlining按钮并且lBehavior为True时,代码显示一条消息告诉用户不允许添加下划线。 (3)修改或重利用Office菜单 也可以修改或重利用Office菜单项。下面的XML在Office菜单中添加项目: <officeMenu> <menu idMso=“FilePrepareMenu“> <button id=“NewPrepButton“ label=“My Prepare Button“ description=“Prepare Time“ image=“TIME“ insertBeforeMso=“FileProperties“ onAction=“NewPrepButton_ClickHandler“/> </menu> <splitButton idMso=“FileSaveAsMenu“> <menu idMso=“FileSaveAsMenu“> <button id=“SayHello“ label=“Say Hello“ description=“This button says hello!“ image=“Colorblk2“ onAction=“SayHello_ClickHandler“/> </menu> </splitButton> </officeMenu>如上所示,Office菜单项出现在<officeMenu>元素中。本例中,代码在“准备”菜单里添加了一个名为“My Prepare Button”的新按钮,放置在菜单列表的顶部并使用了自定义图标。 应该注意到,“另存为”(FileSaveAsMenu)菜单以<splitButton>开始,因为它是一个拆分按钮。 接着,在Custom UI Editor中生成回调代码并复制到VBE中,添加代码如下: ‘ Callback for My Prepare Button on the ‘ Prepare menu of the Office menu. Sub NewPrepButton_ClickHandler(control As IRibbonControl) ‘ Display a message. MsgBox “Are you prepared?”, vbYesNo End Sub ‘ Provides support for the Say Hello Button on the ‘ Save As menu of the Office Menu. Sub SayHello_ClickHandler(control As IRibbonControl) ‘ Display a message. MsgBox “Hello!” End Sub 下面的XML用于重利用另存为“Excel 97-2003工作簿”命令: <commands> <command idMso=“FileSaveA**cel97_2003“ onAction=“FileSaveAs_ClickHandler“/> </commands>下面是相应的VBA代码: ‘ Repurposes callback for the File Save As button. Sub FileSaveAs_ClickHandler(control As IRibbonControl, ByRef fCancelDefault) ‘ Holds the user response. Dim Answer As VbMsgBoxResult ‘ Display a message. Answer = MsgBox(”Saving as an older version. Are you sure?”, vbYesNo) ‘ Act on the response. If Answer = vbYes Then fCancelDefault = False Else fCancelDefault = True End If End Sub 注意参数fCancelDefault的使用。代码开始显示一条消息框,如果用户单击“是”,那么代码将fCancelDefault设置为False,表示显示“另存为”对话框;否则,代码将fCancelDefault设置为True,表示不做任何操作。 上述所有代码中,最重要的回调之一是功能区装载,即在<customUI>元素中使用onLoad属性: <customUI onLoad=“RibbonLoaded“ xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>在工作簿打开时,将产生onLoad回调,查找VBA代码中的RibbonLoaded过程。该过程的代码如下: ‘Define a global variable to hold the Ribbon reference. Dim Rib As IRibbonUI ‘Callback for customUI.onLoad Sub RibbonLoaded(ribbon As IRibbonUI) ‘Save the ribbon reference. Set Rib = ribbon ‘Initialize the behavior state. lBehavior = False ‘Tell the user the Ribbon is loaded. MsgBox “Ribbon Loaded” End Sub 使用Invalidate方法告诉功能区进行重绘,显示移除、修改或添加的特征。 问题10 可以从头开始设计功能区吗? 可以。Microsoft提供了一个名为startFromScratch的属性,将其值设置为true,将移除现有的功能区界面。从头开始设计功能区可以限制用户访问您不希望其使用的功能。 只需在<ribbon>元素中添加startFromScratch属性并设置其值为true,即可从头开始设置功能区: <ribbon startFromScratch=”true”> 问题11 可以从功能区中调用自定义的用户窗体吗? 可以,其实这也是取代自定义复杂的功能区的一种方式,您可以在用户窗体中实现一系列RibbonX控件的操作。而您只需要在功能区中添加一个按钮,用来调用用户窗体。 下面介绍一个显示和使用简单用户窗体的示例。 首先,在功能区中添加一个用于访问用户窗体的按钮。其XML代码如下: <customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“> <ribbon> <tabs> <tab idMso=“TabHome“> <group id=“FormList“ label=“Forms“> <button id=“ShowForm“ label=“Show Form“ imageMso=“HappyFace“ size=“large“ onAction=“ShowMyForm“ /> </group> </tab> </tabs> </ribbon></customUI> 在工作簿中添加回调代码: ‘ Callback for ShowMyForm onAction Sub ShowMyForm(control As IRibbonControl) ‘ Call the common processing routine. ProcessForm End Sub 其中,ProcessForm是一个过程的名称,该过程用于处理用户窗体的操作。 |
2楼 omnw |
阅读完毕,留下脚印。 |
3楼 lrlxxqxa |
|
4楼 海洋之星 |
学习 |