快速 Access 工具列

快速存取工具列 (QAT) 是一個小的可自訂工具列,會公開應用程式所指定的命令集,或由使用者選取。

簡介

根據預設,快速存取工具列 (QAT) 位於應用程式視窗的標題列中,但可以設定為在功能區下方顯示。 除了公開命令之外,快速存取工具列 (QAT) 也包含可自訂的下拉式功能表,其中包含一組完整的預設快速存取工具列 (QAT) 命令, (不論快速存取工具列 (QAT) ) 和一組快速存取工具列 () 和功能區選項。

下列螢幕擷取畫面顯示功能區快速存取工具列範例, (QAT) 。

microsoft paint 功能區中 qat 的螢幕擷取畫面。

快速存取工具列 (QAT) 包含最多 20 個命令的組合,由應用程式指定 (稱為應用程式預設清單清單) 或由使用者選取。 快速存取工具列 (QAT) 可以包含功能區 UI 中其他位置無法使用的唯一命令。

注意

雖然幾乎所有功能區控制項都允許將其相關聯的命令新增至快速存取工具列 (QAT) 透過下列螢幕擷取畫面所示的內容功能表,但內容 快顯 中公開的命令不會提供此操作功能表。

microsoft paint 功能區中命令操作功能表的螢幕擷取畫面。

實作快速存取工具列

如同所有 Windows 功能區架構控制項,充分利用快速存取工具列 (QAT) 需要標記元件來控制功能區內的呈現,以及控管其功能的程式碼元件。

加成

快速存取工具列 (QAT) 控制項是透過 QuickAccessToolbar 元素宣告與命令識別碼相關聯的。 命令識別碼可用來識別和系結快速存取工具列 (QAT) 至應用程式定義的命令處理常式。

除了主要快速存取工具列的基本命令處理常式 (QAT) 功能之外,宣告選擇性 的 CustomizeCommandNameQuickAccessToolbar 元素屬性,會讓架構將 [更多命令 ] 專案新增至 [快速存取工具列] (QAT) 下拉式功能表中,要求定義次要命令處理常式的 [命令] 清單。

如需功能區應用程式的一致性,建議 使用 CustomizeCommandName 命令處理常式啟動快速存取工具列 (QAT) 自訂對話方塊。 由於功能區架構只會在 UI 中提供啟動點,因此當收到此命令的回呼通知時,應用程式只會負責提供自訂對話方塊實作。

下列螢幕擷取畫面顯示 [快速存取工具列] (QAT) 下拉式功能表與 [更多命令 命令] 專案。

具有更多命令的 qat 功能表螢幕擷取畫面...命令專案。

快速存取工具列 (QAT) 的應用程式預設清單是透過 QuickAccessToolbar.ApplicationDefaults 屬性指定,可識別建議命令的預設清單,其中所有清單都會列在 [快速存取工具列] (QAT) 下拉式功能表中。

若要在快速存取工具列 (QAT) 工具列中顯示應用程式預設值清單的命令,每個控制項元素的 ApplicationDefaults.IsChecked 屬性必須具有 值 true 。 上述影像顯示將此屬性 true 設定為 [ 儲存]、[ 復原] 和 [ 重做 命令] 的結果。

QuickAccessToolbar.ApplicationDefaults 支援三種類型的功能區控制項: 按鈕切換按鈕核取方塊

注意

Windows 8和更新版本: (ComboBoxInRibbonGallerySplitButtonGalleryDropDownGallery) 支援所有資源庫型控制項。

資源庫控制項中的專案可以支援暫留時反白顯示。 若要支援暫留醒目提示,資源庫必須是專案庫,並使用 VerticalMenuLayout 類型的 FlowMenuLayout

下列範例示範 QuickAccessToolbar 元素的基本標記。

此區段程式碼會顯示 快速存取工具列 (QAT) 元素的命令宣告。

<Command Name="cmdQAT"
         Symbol="ID_QAT"
         Id="40000"/>
<Command Name="cmdCustomizeQAT"
         Symbol="ID_CUSTOM_QAT"
         Id="40001"/>

此區段程式碼會顯示 快速存取工具列 (QAT) 元素的控制項宣告。

      <Ribbon.QuickAccessToolbar>
        <QuickAccessToolbar CommandName="cmdQAT"
                            CustomizeCommandName="cmdCustomizeQAT">
          <QuickAccessToolbar.ApplicationDefaults>
            <Button CommandName="cmdButton1"/>
            <ToggleButton CommandName="cmdMinimize"
                          ApplicationDefaults.IsChecked="false"/>
          </QuickAccessToolbar.ApplicationDefaults>
        </QuickAccessToolbar>
      </Ribbon.QuickAccessToolbar>

程式碼

功能區架構應用程式必須提供命令處理常式回呼方法,才能操作快速存取工具列 (QAT) 。 此處理程式的運作方式與命令庫處理常式類似,不同之處在于快速存取工具列 (QAT) 不支援類別。 如需詳細資訊,請參閱 使用資源庫

快速存取工具列 (QAT) Command 集合會透過UI_PKEY_ItemsSource屬性索引鍵擷取為IUICollection物件。 在執行時間將命令新增至快速存取工具列 (QAT) ,是藉由將 IUISimplePropertySet 物件新增至 IUICollection來完成。

不同于命令庫,快速存取工具列 (QAT) IUISimplePropertySet物件不需要命令類型屬性 (UI_PKEY_CommandType) 。 不過,命令必須存在於功能區或快速存取工具列 (QAT) 應用程式預設值清單中;無法在執行時間建立新的命令,並新增至快速存取工具列 (QAT) 。

注意

功能區應用程式無法以衍生自 IEnumUnknown 的自訂集合物件取代 QAT (QAT) IUICollection

下列範例示範基本的快速存取工具列 (QAT) 命令處理常式實作。

/* QAT COMMAND HANDLER IMPLEMENTATION */
class CQATCommandHandler
      : public CComObjectRootEx<CComMultiThreadModel>
      , public IUICommandHandler
{
  public:
    BEGIN_COM_MAP(CQATCommandHandler)
      COM_INTERFACE_ENTRY(IUICommandHandler)
    END_COM_MAP()

    // QAT command handler's Execute method
    STDMETHODIMP Execute(UINT nCmdID,
                         UI_EXECUTIONVERB verb, 
                         const PROPERTYKEY* key,
                         const PROPVARIANT* ppropvarValue,
                         IUISimplePropertySet* pCommandExecutionProperties)
    {
      UNREFERENCED_PARAMETER(nCmdID);
      UNREFERENCED_PARAMETER(verb);
      UNREFERENCED_PARAMETER(ppropvarValue);
      UNREFERENCED_PARAMETER(pCommandExecutionProperties);

      // Do not expect Execute callback for a QAT command
      return E_NOTIMPL;
    }

    // QAT command handler's UpdateProperty method
    STDMETHODIMP UpdateProperty(UINT nCmdID,
                                REFPROPERTYKEY key,
                                const PROPVARIANT* ppropvarCurrentValue,
                                PROPVARIANT* ppropvarNewValue)
    {
      UNREFERENCED_PARAMETER(nCmdID);
      UNREFERENCED_PARAMETER(ppropvarNewValue);

      HRESULT hr = E_NOTIMPL;

      if (key == UI_PKEY_ItemsSource)
      {
        ATLASSERT(ppropvarCurrentValue->vt == VT_UNKNOWN);

        CComQIPtr<IUICollection> spCollection(ppropvarCurrentValue->punkVal);

        UINT nCount;
        if (SUCCEEDED(hr = spCollection->GetCount(&nCount)))
        {
          if (nCount == 0)
          {
            // If the current Qat list is empty, then we will add a few items here.
            UINT commands[] =  { cmdSave, cmdUndo};

            int count = _countof(commands);

            for (int i = 0; i < count; i++)
            {
              PROPERTYKEY keys[1] = {UI_PKEY_CommandId};
              CComObject<CItemProperties> *pItem = NULL;
              if (SUCCEEDED(CComObject<CItemProperties>::CreateInstance(&pItem)))
              {
                PROPVARIANT vars[1];

                InitPropVariantFromUInt32(commands[i], &vars[0]);

                pItem->Initialize(NULL, _countof(vars), keys, vars);

                CComPtr<IUnknown> spUnknown;
                pItem->QueryInterface(&spUnknown);
                spCollection->Add(spUnknown);
                            
                FreePropVariantArray(_countof(vars), vars);
              }
            }
          }
          else
          {
            // Do nothing if the Qat list is not empty.
            // Return S_FALSE to indicate the callback succeeded.
            return S_FALSE; 
          }
        }
      }
    return hr;
  }
};

QAT 持續性

快速存取工具列 (QAT) 命令專案和設定可以使用 IUIRibbon::SaveSettingsToStreamIUIRibbon::LoadSettingsFromStream 函式跨應用程式會話保存。 如需詳細資訊,請參閱 保存功能區狀態

快速存取工具列屬性

功能區架構會定義快速存取工具列 (QAT) 控制項 的屬性索引鍵 集合。

一般而言,快速存取工具列 (QAT) 屬性會在功能區 UI 中更新,方法是透過呼叫 IUIFramework::InvalidateUICommand 方法,使與控制項相關聯的命令失效。 無效事件是由 IUICommandHandler::UpdateProperty 回呼方法所定義的屬性更新處理。

IUICommandHandler::UpdateProperty回呼方法不會執行,而且應用程式會查詢更新的屬性值,直到架構需要屬性為止。 例如,當索引標籤啟動時,以及功能區 UI 中顯示的控制項,或顯示工具提示時。

注意

在某些情況下,可以透過 IUIFramework::GetUICommandProperty 方法擷取屬性,並使用 IUIFramework::SetUICommandProperty 方法進行設定。

下表列出與快速存取工具列 (QAT) 控制項相關聯的屬性索引鍵。

屬性索引鍵 備註
UI_PKEY_ItemsSource 支援 IUIFramework::GetUICommandProperty (不支援 IUIFramework::SetUICommandProperty) 。IUIFramework::GetUICommandProperty 會傳回 IUICollection 物件的指標,代表 QAT 中的命令。 每個命令都是藉由其命令識別碼來識別,這是藉由呼叫 IUISimplePropertySet::GetValue 方法並傳入屬性索引鍵 UI_PKEY_CommandId來取得。

[快速存取工具列] (QAT) 下拉式功能表中沒有與 [更多命令命令 ] 專案相關聯的屬性索引鍵