细品RibbonX(40):技巧—在注册表中保存值和从注册表中获取值

细品RibbonX(40):技巧—在注册表中保存值和从注册表中获取值

资料整理来自于论坛
完整版下载地址:http://download.csdn.net/download/nodeman/10264659

 

 Loading ...

 

Windows注册表是一个数据库,用于存储与计算机不同方面相关的设置,例如用户设置、应用程序设备、硬件设置,等等。
VBA提供了与注册表直接交互的方式,这不仅允许我们获取其它程序和硬件的信息,而且也能够使我们选择应用程序中的重要信息并将其存储在注册表中。
本文中,我们的目的是存储和获取关于UI的信息,我们将使用专门为VBA(和VB)配置而留出的部分。并且,我们不需要使用Windows APIs。
VBA提供了用于处理注册表的两个函数:GetSetting和SaveSetting,这两个函数仅能访问下面的注册表句柄键:

    HKEY_CURRENT_USER\Software\VB and VBA Program Settings

如下图所示,当切换按钮时,即使关闭了该工程,其状态值仍保存,因此,在重新打开该工程时,按钮的状态为关闭前的状态,不会因为关闭工程而使按钮的状态值丢失。

定义上图所示界面的XML代码如下:

<customUIxmlns="http://schemas.microsoft.com/office/2006/01/customui"
    onLoad="rxIRibbonUI_onLoad">
    <ribbonstartFromScratch="false">
        <tabs>
            <tabidMso="TabHome">
                <groupid="rxgrp1"
                   insertBeforeMso="GroupClipboard"
                   label="Toggle Custom Tabs">
                    <toggleButtonid="rxtglCustomReview"
                       label="Toggle Custom Review Tab"
                       imageMso="ReviewAcceptChangeMenu"
                       size="large"
                       getPressed="rxtglCustomReview_getPressed"
                       onAction="rxtglShared_Click"/>
                    <separatorid="rxsep1"/>
                    <toggleButtonid="rxtglDataHandling"
                       label="Toggle Data Handling Tab"
                       imageMso="Consolidate"
                       size="large"
                       getPressed="rxtglDataHandling_getPressed"
                       onAction="rxtglShared_Click"/>
                </group>
            </tab>
            <!-- THE CUSTOM REVIEW TAB UI STARTS HERE -->
            <tabid="rxtabCustomReview"
                 getVisible="rxtabCustomReview_getVisible"
                 label="Custom Review"
                 keytip="K">
                <groupidMso="GroupClipboard"/>
                <groupidMso="GroupFont"/>
                <groupid="rxgrpProofingComments"
                  label="Proofing and Comments">
                  <boxid="rxbox1"boxStyle="vertical">
                      <buttonidMso="Spelling"/>
                      <buttonidMso="Thesaurus"/>
                      <buttonidMso="TranslationPane"/>
                  </box>
                  <separatorid="rxsep2"/>
                  <boxid="rxbox2"boxStyle="vertical">
                      <buttonidMso="ReviewNewComment"/>
                      <buttonidMso="ReviewDeleteComment"
                          label="Delete Comment"/>
                      <toggleButtonidMso="ReviewShowAllComments"/>
                  </box>
                </group>
                <groupid="rxgrpChanges"
                   label="Worksheet related changes">
                   <boxid="rxbox"boxStyle="vertical">
                       <buttonidMso="ReviewHighlightChanges"/>
                       <buttonidMso="ReviewProtectAndShareWorkbook"/>
                       <buttonidMso="ReviewAllowUsersToEditRanges"/>
                       <buttonidMso="SheetProtect"/>
                   </box>
                </group>
            </tab>
            <!-- END OF CUSTOM REVIEW TAB -->
            <tabid="rxtabDataHandling"
                 getVisible="rxtabDataHandling_getVisible"
                 label="Data Handling"
                 keytip="Z">
            </tab>
        </tabs>
    </ribbon>
</customUI>

代码包含了一些必须由VBA处理的关键回调。设置了getPressed属性,因为它返回从注册表中获取toggleButton的按下状态的回调,状态是true或false。
接下来,处理Click事件(该事件通过OnAction属性定义为共享的回调)。每次单击时,都会将按钮当前状态保存到注册表。
最后,getVisible属性根据toggleButton的状态决定是否选项卡可见。
本例中,将下面的两个VBA函数封装到自已的函数中,这样可以传递参数到自定义函数中,并且在一定程度上能够控制程序:

Function getRegistry(ByVal strKey As String) As Boolean
    On Error Resume Next
    getRegistry = GetSetting("AddInProject", "TabVisibility", strKey)
    If Err > 0 Then getRegistry = False
End Function
 
Function saveRegistry(ByVal strKey As String, _
    ByVal blnSetting As Boolean)
    SaveSetting "AddInProject", "TabVisibility", strKey, blnSetting
End Function

因为如果键不存在的话,getRegistry函数将返回错误,所以需要添加错误处理以捕获错误。如果发生错误,那么知道该键不存在,getRegistry函数应该返回False。
回调代码如下:

Public gblnShowCustomReviewTab As Boolean
Public gblnShowCustomDataHandlingTab As Boolean
Public gblnCalledOnOpen As Boolean
Public grxIRibbonUI As IRibbonUI
 
Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
    Set grxIRibbonUI = ribbon
End Sub
 
Sub rxtglCustomReview_getPressed(control As IRibbonControl, ByRef returnedVal)
    returnedVal = getRegistry("CustomReviewTab")
    gblnShowCustomReviewTab = getRegistry("CustomReviewTab")
    grxIRibbonUI.InvalidateControl ("rxtabCustomReview")
End Sub
 
Sub rxtglDataHandling_getPressed(control As IRibbonControl, ByRef returnedVal)
    returnedVal = getRegistry("CustomDataHandlingTab")
    gblnShowCustomDataHandlingTab = getRegistry("CustomDataHandlingTab")
    grxIRibbonUI.InvalidateControl ("rxtabDataHandling")
End Sub
 
Sub rxtglShared_Click(control As IRibbonControl, pressed As Boolean)
    Select Case control.ID
        Case "rxtglCustomReview"
            gblnShowCustomReviewTab = pressed
            saveRegistry "CustomReviewTab", pressed
            gblnCalledOnOpen = False
 
        Case "rxtglDataHandling"
            gblnShowCustomDataHandlingTab = pressed
            gblnCalledOnOpen = False
            saveRegistry "CustomDataHandlingTab", pressed
    End Select
    grxIRibbonUI.Invalidate
End Sub
 
Sub rxtabCustomReview_getVisible(control As IRibbonControl, ByRef returnedVal)
    returnedVal = gblnShowCustomReviewTab
    If Not gblnCalledOnOpen Then
        If gblnShowCustomReviewTab = True Then Application.SendKeys ("%K{RETURN}")
    End If
End Sub
 
Sub rxtabDataHandling_getVisible(control As IRibbonControl, ByRef returnedVal)
    returnedVal = gblnShowCustomDataHandlingTab
    If Not gblnCalledOnOpen Then
 
        If gblnShowCustomDataHandlingTab = True Then Application.SendKeys ("%Z{RETURN}")
    End If
End Sub

现在,就可以试试了!关闭工作簿后再打开,处理控件的设置将根据记录在注册表键中的值更新。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值