box元素用來在組里指定的控件周圍放置一個可視的框,其主要目的是將控件作為一個單元組合在一起。
通常情況下,分配到組中的每個控件都被放置在先前的控件下面直到該列被填滿,然后下一個控件被放置在其右側(cè)列的頂行。然而,通過在框里面組合命令,可以將幾個控件視作一個整體,并且一次將整個組放置在功能區(qū)。這有助于我們方便地組織顯示的順序,不會使界面混亂,或者留下一些空白。
1、box元素必需的屬性
box元素需要下表1所列的id屬性之一。
表1:box元素必需的屬性
屬性 | 何時使用 |
id | 當創(chuàng)建自已的框時 |
idQ | 當在命名空間之間創(chuàng)建共享的框時 |
2、帶有回調(diào)簽名的可選的靜態(tài)屬性和動態(tài)屬性
雖然指定位置是可選的,但是如果選擇相對于另一個元素決定框的位置,那么必須使用下表2列出的任一insert屬性。
表2:box元素可選的insert屬性
INSERT屬性 | 允許值 | 默認值 | 何時使用 |
insertAfterMso | 有效的Mso組 | 在組末尾插入 | 在Microsoft控件之后插入 |
insertBeforeMso | 有效的Mso組 | 在組末尾插入 | 在Microsoft控件之前插入 |
insertAfterQ | 有效的組idQ | 在組末尾插入 | 在共享的命名空間控件之后插入 |
insertBeforeQ | 有效的組idQ | 在組末尾插入 | 在共享的命名空間控件之前插入 |
也可以為box元素設(shè)置下表3所列的可選的屬性和回調(diào)。
表3:box元素可選的屬性和回調(diào)
靜態(tài)屬性 | 動態(tài)屬性 | 允許值 | 默認值 | 動態(tài)屬性的VBA回調(diào)簽名 |
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元素的父對象
在下列任何控件內(nèi)都能放置box控件:
n box
n group
5、創(chuàng)建自定義的box元素
示例1
本示例演示使用水平的box控件的效果。
(1)創(chuàng)建一個新的.xlsx文件,并將其保存為Excel box Example.xlsx。
(2)關(guān)閉該文件并在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)保存后關(guān)閉CustomUI Editor。
(5)在Excel中重新打開該文件,下圖即為上述XML代碼創(chuàng)建的組。
創(chuàng)建了一個水平框?qū)⑺膫€格式元素組合在一起,允許其作為一個單元格移動。除了允許按鈕跨越一列外,水平組也在Button1和Button2的右側(cè)創(chuàng)建了“空白”,而Button3和Button4則沒有。
示例2
(6)關(guān)閉Excel box Example.xlsx。
(7)重新在CustomUI Editor中打開該文件。
(8)修改XML代碼如下:
將
boxStyle=“horizontal“
修改為:
boxStyle=“vertical“
(9)保存后關(guān)閉CustomUI Editor。
(10)在Excel中重新打開該文件,下圖即為上述XML代碼創(chuàng)建的組。
示例3
本示例除了演示嵌套的框控件外,還將展示使用getVisible回調(diào)控制框的可視性的效果。
示例中包含兩個box控件,每一個包含兩個前面示例中使用的格式控件。此外,每個框都宿于其父框里,允許用戶在功能區(qū)中預(yù)留垂直空間以便沒有其它按鈕在這些控件下面。同時,使用三個復(fù)選框來選擇哪個框可見。
(1)新建一個工作簿,以.xlsm為擴展名保存后關(guān)閉。
(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控件,其它兩個嵌套在第一個中。三個控件共享回調(diào)。當然,需要能夠使功能區(qū)無效以迫使box控件隱藏或顯示,因此需要捕獲RibbonUI對象。
(3)生成回調(diào)簽名并復(fù)制后,關(guān)閉CustomUI Editor。
(4)重新打開該工作簿,打開VBE,將回調(diào)簽名代碼粘貼到標準模塊,然后開始完善代碼。
首先,在模塊頂部聲明公共變量:
Dim rxIRibbonUI As IRibbonUI
Dim bBox1_Visible As Boolean
Dim bBox11_Visible As Boolean
Dim bBox12_Visible As Boolean
第1行代碼中的變量用于存儲RibbonUI對象,能夠在后面使功能區(qū)無效。其它三個變量包含不同組的可視狀態(tài)。由于通過復(fù)選框控件控制,因此使用這些變量存儲與每個框相關(guān)的復(fù)選框的狀態(tài)。
除了在裝載時捕獲RibbonUI外,需要確保每個框控件是可見的。因此,onLoad回調(diào)代碼如下:
‘customUI.onLoad回調(diào)
Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
Set rxIRibbonUI = ribbon
bBox1_Visible = True
bBox11_Visible = True
bBox12_Visible = True
End Sub
接下來,設(shè)置box控件的共享的getVisible回調(diào):
‘rxbox1,rxbox11,rxbox12 getVisible共享回調(diào)
Sub rxboxshared_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語句評估觸發(fā)回調(diào)的控件,從變量中獲取合適的值并返回給RibbonUI。getPressed回調(diào)基于該變量處理復(fù)選框控件。
‘rxchkVisibleBox1,-Box11,-Box12 getPressed共享的回調(diào)
Sub rxchkShared_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
接下來,創(chuàng)建當單擊復(fù)選框時觸發(fā)的程序。修改可見的變量的值為當前“按下”狀態(tài)(true或false),然后觸發(fā)功能區(qū)的無效。這種無效不僅僅觸發(fā)每一個box控件的getVisible回調(diào),也確保所有的復(fù)選框控件更新:
‘rxchkVisibleBox1,-Box11,-Box12 onAction共享的回調(diào)
Sub rxchkShared_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回調(diào),便于設(shè)置每個控件為默認的可見狀態(tài):
‘rxbtnReset onAction共享回調(diào)使按鈕可見
Sub rxbtnReset_click(control As IRibbonControl)
bBox1_Visible = True
bBox11_Visible = True
bBox12_Visible = True
rxIRibbonUI.Invalidate
End Sub
好了!該測試用戶界面效果了。保存代碼并關(guān)閉工作簿,再重新打開該工作簿,如下圖所示。
試著清除復(fù)選框,相應(yīng)的控件將消失。單擊“Reset All”將使所有控件恢復(fù)可見。
注意,試圖使用getVisible回調(diào)設(shè)置父框為visible=”false”,將不會像您想像的那樣隱藏父框和所有的子控件。相反,父和子box控件將保持當前狀態(tài),控件本身是可見的并且工作,而任何試圖通過回調(diào)對嵌套控件狀態(tài)的修改都將忽略。這種影響將保留到父框控件的getVisible回調(diào)重新被設(shè)置為True。
隱藏父box控件的唯一辦法是隱藏所有的子項。此時,父框控件將折疊并且不可見,即使其visible屬性被設(shè)置為True。