细品RibbonX(30):box元素详解
资料整理来自于论坛
完整版下载地址:http://download.youkuaiyun.com/download/nodeman/10264659
Loading ...
box元素用来在组里指定的控件周围放置一个可视的框,其主要目的是将控件作为一个单元组合在一起。
通常情况下,分配到组中的每个控件都被放置在先前的控件下面直到该列被填满,然后下一个控件被放置在其右侧列的顶行。然而,通过在框里面组合命令,可以将几个控件视作一个整体,并且一次将整个组放置在功能区。这有助于我们方便地组织显示的顺序,不会使界面混乱,或者留下一些空白。
1、box元素必需的属性
box元素需要下表1所列的id属性之一。
表1:box元素必需的属性
属性 | 何时使用 |
id | 当创建自已的框时 |
idQ | 当在命名空间之间创建共享的框时 |
2、带有回调签名的可选的静态属性和动态属性
虽然指定位置是可选的,但是如果选择相对于另一个元素决定框的位置,那么必须使用下表2列出的任一insert属性。
表2:box元素可选的insert属性
INSERT属性 | 允许值 | 默认值 | 何时使用 |
insertAfterMso | 有效的Mso组 | 在组末尾插入 | 在Microsoft控件之后插入 |
insertBeforeMso | 有效的Mso组 | 在组末尾插入 | 在Microsoft控件之前插入 |
insertAfterQ | 有效的组idQ | 在组末尾插入 | 在共享的命名空间控件之后插入 |
insertBeforeQ | 有效的组idQ | 在组末尾插入 | 在共享的命名空间控件之前插入 |
也可以为box元素设置下表3所列的可选的属性和回调。
表3:box元素可选的属性和回调
静态属性 | 动态属性 | 允许值 | 默认值 | 动态属性的VBA回调签名 |
boxStyle | (none) | horizontal,vertical | horizontal | (none) |
visible | getVisible | true,false,1,0 | true | Sub GetVisible(control As IRibbonControl, ByRef returnedVal) |
3、box元素允许的子对象
box控件能够包含各种各样的RibbonX控件:
n box
n button
n buttonGroup
n checkbox
n comboBox
n control
n dropDown
n dynamicMenu
n editBox
n gallery
n labelControl
n menu
n splitButton
n toggleButton
注意,box控件也可以包含其它box控件,称之为嵌套。
4、box元素的父对象
在下列任何控件内都能放置box控件:
n box
n group
5、创建自定义的box元素
示例1
本示例演示使用水平的box控件的效果。
(1)创建一个新的.xlsx文件,并将其保存为Excel box Example.xlsx。
(2)关闭该文件并在CustomUI Editor中打开。
(3)输入下列XML代码:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
<ribbon>
<tabs>
<tab id = “rxtab_Demo“
label=“Demo“
insertBeforeMso=“TabHome“>
<group id=“rxgrp_Demo“
label=“Demo Group“>
<box id=“rxboxFormat1“
boxStyle=“horizontal“
visible=“true“>
<toggleButton idMso=“Bold“/>
<toggleButton idMso=“Italic“/>
<toggleButton idMso=“Underline“/>
<toggleButton idMso=“UnderlineDouble“/>
</box>
<button id=“rxbtnHappy1“
imageMso=“HappyFace“
label=“Button 1“/>
<button id=“rxbtnHappy2“
imageMso=“HappyFace“
label=“Button 2“/>
<button id=“rxbtnHappy3“
imageMso=“HappyFace“
label=“Button 3“/>
<button id=“rxbtnHappy4“
imageMso=“HappyFace“
label=“Button 4“/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
(4)保存后关闭CustomUI Editor。
(5)在Excel中重新打开该文件,下图即为上述XML代码创建的组。
创建了一个水平框将四个格式元素组合在一起,允许其作为一个单元格移动。除了允许按钮跨越一列外,水平组也在Button1和Button2的右侧创建了“空白”,而Button3和Button4则没有。
示例2
(6)关闭Excel box Example.xlsx。
(7)重新在CustomUI Editor中打开该文件。
(8)修改XML代码如下:
将
boxStyle=“horizontal“
修改为:
boxStyle=“vertical“
(9)保存后关闭CustomUI Editor。
(10)在Excel中重新打开该文件,下图即为上述XML代码创建的组。
示例3
本示例除了演示嵌套的框控件外,还将展示使用getVisible回调控制框的可视性的效果。
示例中包含两个box控件,每一个包含两个前面示例中使用的格式控件。此外,每个框都宿于其父框里,允许用户在功能区中预留垂直空间以便没有其它按钮在这些控件下面。同时,使用三个复选框来选择哪个框可见。
(1)新建一个工作簿,以.xlsm为扩展名保存后关闭。
(2)在CustomUI Editor中打开该工作簿,并输入下列XML代码:
<customUI onLoad=“rxIRibbonUI_onLoad“xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
<ribbon startFromScratch=“false“>
<tabs>
<tab id=“rxtabDemo“
insertBeforeMso=“TabHome“
label=“Demo“>
<group id=“rxgrpDemo“
label=“Demo Group“>
<box id=“rxbox1“
boxStyle=“vertical“
getVisible=“rxboxshared_getVisible“>
<box id=“rxbox11“
boxStyle=“horizontal“
getVisible=“rxboxshared_getVisible“>
<toggleButton idMso=“Bold“/>
<toggleButton idMso=“Italic“/>
</box>
<box id=“rxbox12“
boxStyle=“horizontal“
getVisible=“rxboxshared_getVisible“>
<toggleButton idMso=“Underline“/>
<toggleButton idMso=“UnderlineDouble“/>
</box>
</box>
<checkBox id=“rxchkVisibleBox1“
label=“Box 1 Visible?“
getPressed=“rxchkShared_pressed“
onAction=“rxchkShared_click“/>
<checkBox id=“rxchkVisibleBox11“
label=“Box 1-1 Visible?“
getPressed=“rxchkShared_pressed“
onAction=“rxchkShared_click“/>
<checkBox id=“rxchkVisibleBox12“
label=“Box 1-2 Visible?“
getPressed=“rxchkShared_pressed“
onAction=“rxchkShared_click“/>
<button id=“rxbtnReset“
imageMso=“HappyFace“
label=“Reset All“
onAction=“rxbtnReset_click“/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
注意,本示例实际上共有三个box控件,其它两个嵌套在第一个中。三个控件共享回调。当然,需要能够使功能区无效以迫使box控件隐藏或显示,因此需要捕获RibbonUI对象。
(3)生成回调签名并复制后,关闭CustomUIEditor。
(4)重新打开该工作簿,打开VBE,将回调签名代码粘贴到标准模块,然后开始完善代码。
首先,在模块顶部声明公共变量:
Dim rxIRibbonUI AsIRibbonUI
Dim bBox1_Visible AsBoolean
Dim bBox11_Visible AsBoolean
Dim bBox12_Visible AsBoolean
第1行代码中的变量用于存储RibbonUI对象,能够在后面使功能区无效。其它三个变量包含不同组的可视状态。由于通过复选框控件控制,因此使用这些变量存储与每个框相关的复选框的状态。
除了在装载时捕获RibbonUI外,需要确保每个框控件是可见的。因此,onLoad回调代码如下:
‘customUI.onLoad回调
SubrxIRibbonUI_onLoad(ribbon As IRibbonUI)
Set rxIRibbonUI = ribbon
bBox1_Visible = True
bBox11_Visible = True
bBox12_Visible = True
End Sub
接下来,设置box控件的共享的getVisible回调:
‘rxbox1,rxbox11,rxbox12getVisible共享回调
Subrxboxshared_getVisible(control As IRibbonControl, ByRef returnedVal)
Select Case control.ID
Case “rxbox1″
returnedVal = bBox1_Visible
Case “rxbox11″
returnedVal = bBox11_Visible
Case “rxbox12″
returnedVal = bBox12_Visible
End Select
End Sub
case语句评估触发回调的控件,从变量中获取合适的值并返回给RibbonUI。getPressed回调基于该变量处理复选框控件。
‘rxchkVisibleBox1,-Box11,-Box12getPressed共享的回调
SubrxchkShared_pressed(control As IRibbonControl, ByRef returnedVal)
Select Case control.ID
Case “rxchkVisibleBox1″
returnedVal = bBox1_Visible
Case “rxchkVisibleBox11″
returnedVal = bBox11_Visible
Case “rxchkVisibleBox12″
returnedVal = bBox12_Visible
End Select
End Sub
接下来,创建当单击复选框时触发的程序。修改可见的变量的值为当前“按下”状态(true或false),然后触发功能区的无效。这种无效不仅仅触发每一个box控件的getVisible回调,也确保所有的复选框控件更新:
‘rxchkVisibleBox1,-Box11,-Box12onAction共享的回调
SubrxchkShared_click(control As IRibbonControl, pressed As Boolean)
Select Case control.ID
Case “rxchkVisibleBox1″
bBox1_Visible = pressed
Case “rxchkVisibleBox11″
bBox11_Visible = pressed
Case “rxchkVisibleBox12″
bBox12_Visible = pressed
End Select
rxIRibbonUI.Invalidate
End Sub
最后是添加的按钮的onAction回调,便于设置每个控件为默认的可见状态:
‘rxbtnReset onAction共享回调使按钮可见
SubrxbtnReset_click(control As IRibbonControl)
bBox1_Visible = True
bBox11_Visible = True
bBox12_Visible = True
rxIRibbonUI.Invalidate
End Sub
好了!该测试用户界面效果了。保存代码并关闭工作簿,再重新打开该工作簿,如下图所示。
试着清除复选框,相应的控件将消失。单击“Reset All”将使所有控件恢复可见。
注意,试图使用getVisible回调设置父框为visible=”false”,将不会像您想像的那样隐藏父框和所有的子控件。相反,父和子box控件将保持当前状态,控件本身是可见的并且工作,而任何试图通过回调对嵌套控件状态的修改都将忽略。这种影响将保留到父框控件的getVisible回调重新被设置为True。
隐藏父box控件的唯一办法是隐藏所有的子项。此时,父框控件将折叠并且不可见,即使其visible属性被设置为True。