本帖最后由 jiulongpo 于 2012-8-6 20:29 编辑
接 细品RibbonX(16):RibbonX开发基础问答
(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=“FileSaveAsExcel97_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是一个过程的名称,该过程用于处理用户窗体的操作。
|