|
楼主 |
发表于 2012-7-27 19:48
|
显示全部楼层
接 细品RibbonX(45):在快速访问工具栏(QAT)中添加项目
使用表驱动(Table-Driven)方式定制QAT
下图是一个自定义QAT的示例,使用表装载详细信息到QAT中。
首先,编写包含UI和QAT菜单按钮的XML代码,这里创建的是文档控件按钮:
- <documentControls>
- <control
- id="rxgrp"
- imageMso="AdvancedFileProperties"/>
- <button
- id="rxbtnShowPopup"
- image="rob"
- screentip="This is Robert's QAT"
- supertip="You can only customize the QAT by starting from scratch. If you do not do that you will not be able to make any changes..."
- onAction="rxbtnShowPopup_Click"
- />
- </documentControls>
复制代码
上述XML代码将产生上图所示的两个QAT按钮,这里的关键是赋给onAction属性的回调,单击该按钮后将显示菜单。
接着,创建包含菜单信息的表,如下图所示。
上图所示的表只是一个建议,因为您可以在其中添加更多的选项。现在,使用VBA阅读该表并创建菜单:
- Public Const POPNAME As String = "MY POPUP"
-
- Sub loadPopup()
- Dim mnuWs As Worksheet
- Dim cmdbar As CommandBar
- Dim cmdbarPopup As CommandBarPopup
- Dim cmdbarBtn As CommandBarButton
- Dim nRowCount As Long
-
- Call unloadPopup
- Set mnuWs = ThisWorkbook.Sheets("MenuItems")
- Set cmdbar = Application.CommandBars.Add(POPNAME, msoBarPopup)
-
- nRowCount = 2
- With mnuWs
- Do Until IsEmpty(.Cells(nRowCount, 1))
-
- Select Case UCase(.Cells(nRowCount, 1))
- Case "POPUP"
- Set cmdbarPopup = cmdbar.Controls.Add(msoControlPopup)
- cmdbarPopup.Caption = .Cells(nRowCount, 2)
- If .Cells(nRowCount, 3) <> "" Then
- cmdbarPopup.BeginGroup = True
- End If
-
- Case "BUTTON"
- Set cmdbarBtn = cmdbarPopup.Controls.Add(msoControlButton)
- cmdbarBtn.Caption = .Cells(nRowCount, 2)
- If .Cells(nRowCount, 3) <> "" Then
- cmdbarBtn.BeginGroup = True
- End If
- cmdbarBtn.FaceId = .Cells(nRowCount, 4)
- cmdbarBtn.OnAction = .Cells(nRowCount, 5)
-
- Case "BUTTON_STANDALONE"
- Set cmdbarBtn = cmdbar.Controls.Add(msoControlButton)
- cmdbarBtn.Caption = .Cells(nRowCount, 2)
- If .Cells(nRowCount, 3) <> "" Then
- cmdbarBtn.BeginGroup = True
- End If
- cmdbarBtn.FaceId = .Cells(nRowCount, 4)
- cmdbarBtn.OnAction = .Cells(nRowCount, 5)
-
- End Select
- nRowCount = nRowCount + 1
- Loop
- End With
-
- End Sub
-
- Sub unloadPopup()
- On Error Resume Next
- Application.CommandBars(POPNAME).Delete
- End Sub
-
- Sub showAbout()
- MsgBox "This is a sample on how to customize the QAT on the fly!!", vbInformation
- End Sub
-
- Sub showHelp()
- On Error GoTo Err_Handler
- ThisWorkbook.FollowHyperlink "http://www.msofficegurus.com", , True, True
- Exit Sub
-
- Err_Handler:
- MsgBox Err.Description, vbCritical, Err.Number
-
- End Sub
复制代码
最后,需要编写回调的代码。使用onLoad事件调用loadPopup过程,以便创建弹出菜单,并准备当在QAT中单击该按钮时使用,也包含当发生单击时显示弹出菜单的单击事件代码:
- Dim grxIRibbonUI As IRibbonUI
-
- Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
- On Error Resume Next
- Set grxIRibbonUI = ribbon
-
- Application.Workbooks.Add
- If ActiveWorkbook.Name <> ThisWorkbook.Name Then
- With ActiveWorkbook
- .Saved = True
- .Close
- End With
- End If
-
- ' 可以在这个事件或者ThisWorkbook的Open事件中装载弹出菜单
- Call loadPopup
- End Sub
-
- Sub rxbtnShowPopup_Click(control As IRibbonControl)
- On Error Resume Next
- Application.CommandBars(POPNAME).ShowPopup
- End Sub
-
- Sub rxbtnHappy_Click(control As IRibbonControl)
- MsgBox "This is Mr. Happy Face... hurray!!", vbExclamation
- End Sub
复制代码
定制QAT时的一些注意事项
虽然在QAT中可以方便地实现自定义,但也有一些缺陷。
(1)无法装载控件
上文中曾经谈到,在定制好后,例如按钮和组,打开工作簿时,却发现定制的控件没有出现。这种情况在使用sharedControls时非常普遍。
一种解决方法是先最小化工作簿,然后再最大化,通过刷新来使定制的控件出现;或者再打开一个工作簿后,将其关闭,看看定制的控件是否出现。
(2)无法为控件装载自定义图像
共享控件的表现通常无法预料,并且不能提供可信赖且一致的界面,因此建议在共享控件中尽量不要使用自定义图像。
至于文档控件,可以使用下面的过程刷新包含UI的窗口来解决此类问题:
- Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
- Set grxIRibbonUI = ribbon
- On Error Resume Next
- Application.Workbooks.Add
- If ActiveWorkbook.Name <> ThisWorkbook.Name Then
- With ActiveWorkbook
- .Saved = True
- .Close
- End With
- End If
- End Sub
复制代码
上述技巧也能用于无法装载自定义控件中。
(3)复制控件
在QAT中控件的复制通常发生在工作簿或文档之间切换时。假设有一个包含定制的QAT的工作簿,当按Alt+Tab移动到另一个文档,然后返回定制的工作簿时,在QAT中的控件被复制、三次复制、四次复制……这种复制能够被传播到没有包含任何XML定制的其它工作簿和文档。
此时,需要关闭后重新打开文档才能消除这种不应有的复制。
|
|