六、使UI组件无效 Ribbon的一个重要方面是使Ribbon无效或指定的控件无效。 某些操作仅当使整个Ribbon无效才能执行,而另一些操作只需通过使指定控件无效来完成。 1、无效能处理什么?为什么需要? IRibbonUI对象包含两个方法:Invalidate和InvalidateControl。 表:IRibbonUI对象模型 方法 用途 Invalidate() 为更新而标记整个功能区(顺序标记其中的每个控件) InvalidateControl(strControlID) 为更新而标记特定的控件(被更新的控件作为字符串传递到 方法的参数中)(strControlID) 理解Invalidate方法的关键是该方法使UI中每个控件都无效,意味着强制调用在UI中定义的所有回调。此外,也将导致更新所有控件,而无论其是否有回调。当使Ribbon无效时,在Ribbon中作出调用,在UI中指定的每个过程都将运行。 “刷新”指在打开工程时简单地更新在UI中已经装载的控件;“重新装载”指卸载并重新装载UI中的整个项目。 除非确实需要作用整个Ribbon,更好的选择是在执行期间的指定时刻使单个控件无效,即当需要时仅使该控件无效。 要使整个Ribbon或Ribbon中指定的控件无效,需要设置代表IRibbonUI对象的全局变量,可通过在onLoad属性中指定回调来实现: <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="rxIRibbonUI_onLoad"> </customUI> 接下来,编写VBA代码处理在onLoad属性中指定的回调: Public grxIRibbonUI As IRibbonUI Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI) Set grxIRibbonUI=ribbon End Sub 注意,代表IRibbonUI对象的变量在标准模块的全局声明区中声明,以便于能被工程的其他部分访问。 2、使整个Ribbon无效 (1)创建一个新的Excel文件,并以启用宏的工作簿保存。 (2)使用CustomUI Editor,在工作簿文件中添加XML代码: <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="rxIRibbonUI_onLoad"> <ribbon> <tabs> <tab id="rxtabDemo" label="My Custom Tab" insertBeforeMso="TabHome"> <group id="rxgrpDemo" label="My Demo Group"> <button id="rxbtn" getLabel="rxshared_getLabel" size="normal" onAction="rxshared_click" imageMso="FillRight"/> <button id="rxbtn2" getLabel="rxshared_getLabel" size="normal" onAction="rxshared_click" imageMso="FillRight"/> </group> </tab> </tabs> </ribbon> </customUI> (3)保存并验证代码。 (4)单击“Generate Callbacks”按钮生成回调。 (5)复制回调代码并关闭该文件。 (6)在Excel中打开该工作簿,添加一个标准模块。 (7)粘贴代码到该模块中,并补充代码。 Public grxIRibbonUI As IRibbonUI Public glngCount1 As Long Public glngCount2 As Long 'Callback for customUI.onLoad Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI) Set grxIRibbonUI = ribbon End Sub 'Callback for rxbtn onAction Sub rxshared_click(control As IRibbonControl) grxIRibbonUI.Invalidate End Sub 'Callback for rxbtn getLabel Sub rxshared_getLabel(control As IRibbonControl, ByRef returnedVal) Select Case control.ID Case "rxbtn" returnedVal = "功能区无效:" & glngCount1 & "次." glngCount1 = glngCount1 + 1 Case "rxbtn2" returnedVal = "功能区无效:" & glngCount2 & "次." glngCount2 = glngCount2 + 1 End Select End Sub 注意,此时单击任一按钮,两个标签均更新,如下图。因为单击按钮时代码使整个Ribbon无效,所以两个控件都无效,共享的getLabel过程为第一个按钮调用一次,又为第二个按钮所调用。 3、使单个控件无效 仍以上面的例子,仅使触发click事件的按钮无效。将共享的click事件和共享的getLabel事件修改如下: Public grxIRibbonUI As IRibbonUI Public glngCount1 As Long Public glngCount2 As Long 'Callback for customUI.onLoad Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI) Set grxIRibbonUI = ribbon End Sub 'Callback for rxbtn onAction Sub rxshared_click(control As IRibbonControl) Select Case control.ID Case "rxbtn" glngCount1 = glngCount1 + 1 Case "rxbtn2" glngCount2 = glngCount2 + 1 End Select grxIRibbonUI.InvalidateControl (control.ID) End Sub 'Callback for rxbtn getLabel Sub rxshared_getLabel(control As IRibbonControl, ByRef returnedVal) Select Case control.ID Case "rxbtn" returnedVal = "功能区无效:" & glngCount1 & "次." Case "rxbtn2" returnedVal = "功能区无效:" & glngCount2 & "次." End Select End Sub 此时,只会使单击的控件无效,如下图。
|