如何访问尚未打开的功能区选项卡上的控件

How to access a control on a ribbon tab that has not been opened yet?

本文关键字:功能区 选项 控件 何访问 访问      更新时间:2023-10-16

我有一个功能区应用程序,它有三个选项卡。在OnCreate事件中,我需要选中一个复选框,该复选框不在打开应用程序时显示的选项卡上。

问题是我不能勾选复选框。当我打开包含它的选项卡时,复选框处于未选中状态。我所知道的是,因为功能区是动态创建的,所以我想要访问的控件还不存在。

有什么方法可以访问复选框?

在创建控件后尝试检查控件,(例如)创建控件的事件。创建后,可以指定单击时将触发的过程,也可以指定是否检查该过程。希望这能有所帮助。

在WTL中,它非常简单:

  1. 您应该重写OnRibbonQueryState():

    bool CMainFrame::OnRibbonQueryState(UINT nCmdID, REFPROPERTYKEY key)
    {
    switch (nCmdID)
    {
    case RID_SETTINGS_GUI_SHOWSTATUSBAR:
    if (IsEqualGUID(key.fmtid, UI_PKEY_BooleanValue.fmtid))
    return m_showStatusBarCtrl.IsChecked();
    }
    return DefRibbonQueryState(nCmdID, key); //Default WTL behavior
    }
    
  2. 添加您的处理程序:

    COMMAND_ID_HANDLER(RID_SETTINGS_GUI_SHOWSTATUSBAR, OnShowStatusbarChanged)
    LRESULT CMainFrame::OnShowStatusbarChanged(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
    {
    m_showStatusBarCtrl.OnCheckboxChanged();
    bool currState = m_showStatusBarCtrl.IsChecked();
    ::ShowWindow(m_hWndStatusBar, currState ? SW_SHOW : SW_HIDE);
    UpdateLayout();
    return 0;
    }
    

    m_showStatusBarCtrl-是一个简单的状态包装器(bool)。