クイック アクセス ツール バー

クイック アクセス ツール バー (QAT) は、アプリケーションによって指定されるか、ユーザーによって選択されたコマンドのセットを公開する、カスタマイズ可能な小さなツール バーです。

はじめに

既定では、クイック アクセス ツール バー (QAT) はアプリケーション ウィンドウのタイトル バーにありますが、リボンの下に表示するように構成できます。 コマンドの公開に加えて、クイック アクセス ツール バー (QAT) には、既定のクイック アクセス ツール バー (QAT) コマンドの完全なセット (クイック アクセス ツール バー (QAT) に表示されるかどうか) とクイック アクセス ツール バー (QAT) とリボン オプションのセットを含むカスタマイズ可能なドロップダウン メニューも含まれています。

次のスクリーン ショットは、リボン クイック アクセス ツール バー (QAT) の例を示しています。

Microsoft ペイント リボンの qat のスクリーン ショット。

クイック アクセス ツール バー (QAT) は、アプリケーション (アプリケーションの既定値の一覧と呼ばれます) によって指定されるか、ユーザーによって選択された最大 20 個のコマンドの組み合わせで構成されます。 クイック アクセス ツール バー (QAT) には、リボン UI の他の場所では使用できない一意のコマンドを含めることができます。

注意

ほぼすべてのリボン コントロールでは、次のスクリーン ショットに示すコンテキスト メニューを使用して、関連するコマンドをクイック アクセス ツール バー (QAT) に追加できますが、 コンテキスト ポップアップ で公開されるコマンドでは、このコンテキスト メニューは提供されません。

Microsoft ペイント リボンのコマンド コンテキスト メニューのスクリーン ショット。

クイック アクセス ツール バーを実装する

すべての Windows リボン フレームワーク コントロールと同様に、クイック アクセス ツール バー (QAT) を最大限に活用するには、リボン内でのプレゼンテーションを制御するマークアップ コンポーネントと、その機能を制御するコード コンポーネントの両方が必要です。

マークアップ

クイック アクセス ツール バー (QAT) コントロールは、 QuickAccessToolbar 要素を使用してマークアップで宣言され、コマンド ID に関連付けられます。 コマンド ID は、クイック アクセス ツール バー (QAT) を識別し、アプリケーションによって定義されたコマンド ハンドラーにバインドするために使用されます。

主要なクイック アクセス ツール バー (QAT) 機能の基本的なコマンド ハンドラーに加えて、オプションの CustomizeCommandNameQuickAccessToolbar 要素属性を宣言すると、フレームワークは、セカンダリ コマンド ハンドラーを定義する必要があるクイック アクセス ツール バー (QAT) ドロップダウン メニューのコマンド リストに [ その他 のコマンド] 項目を追加します。

リボン アプリケーション間で一貫性を保つには、 CustomizeCommandName コマンド ハンドラーでクイック アクセス ツール バー (QAT) のカスタマイズ ダイアログを起動することをお勧めします。 リボン フレームワークは UI の起動ポイントのみを提供するため、アプリケーションは、このコマンドのコールバック通知を受け取ったときにカスタマイズ ダイアログの実装を提供する必要があります。

次のスクリーン ショットは、[ その他のコマンド] コマンド項目を含むクイック アクセス ツール バー (QAT) ドロップダウン メニューを示しています。

その他のコマンドを含む qat メニューのスクリーン ショット...コマンド項目。

クイック アクセス ツール バー (QAT) のアプリケーションの既定の一覧は、推奨されるコマンドの既定の一覧を識別する QuickAccessToolbar.ApplicationDefaults プロパティを使用して指定します。これらはすべて [クイック アクセス ツール バー (QAT)] ドロップダウン メニューに表示されます。

クイック アクセス ツール バー (QAT) ツール バーにアプリケーションの既定の一覧からコマンドを表示するには、各コントロール要素の ApplicationDefaults.IsChecked 属性の値 trueが である必要があります。 上の画像は、保存元に戻す、やり直しコマンドに対してこの属性を にtrue設定した結果示しています。

QuickAccessToolbar.ApplicationDefaults では、 ボタントグル ボタンチェック ボックスの 3 種類のリボン コントロールがサポートされています。

注意

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) コマンド コレクションは、UI_PKEY_ItemsSource プロパティ キーを使用して IUICollection オブジェクトとして取得されます。 実行時にクイック アクセス ツール バー (QAT) にコマンドを追加するには、 IUISimplePropertySet オブジェクトを IUICollection に追加します。

コマンド ギャラリーとは異なり、クイック アクセス ツール バー (QAT) IUISimplePropertySet オブジェクトにはコマンドの種類プロパティ (UI_PKEY_CommandType) は必要ありません。 ただし、コマンドはリボンまたはクイック アクセス ツール バー (QAT) アプリケーションの既定の一覧に存在する必要があります。実行時に新しいコマンドを作成してクイック アクセス ツール バー (QAT) に追加することはできません。

注意

リボン アプリケーションは、クイック アクセス ツール バー (QAT) IUICollection を IEnumUnknown から派生したカスタム コレクション オブジェクトに置き換えることはできません。

次の例は、基本的なクイック アクセス ツール バー (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::SaveSettingsToStream 関数と IUIRibbon::LoadSettingsFromStream 関数を使用して、アプリケーション セッション間で保持できます。 詳細については、「 リボンの状態を保持する」を参照してください。

クイック アクセス ツールバーのプロパティ

リボン フレームワークは、クイック アクセス ツール バー (QAT) コントロールの プロパティ キー のコレクションを定義します。

通常、クイック アクセス ツール バー (QAT) プロパティは、 IUIFramework::InvalidateUICommand メソッドの呼び出しによってコントロールに関連付けられている Command を無効にすることで、リボン UI で更新されます。 無効化イベントが処理され、 IUICommandHandler::UpdateProperty コールバック メソッドによって定義されたプロパティが更新されます。

IUICommandHandler::UpdateProperty コールバック メソッドは実行されず、アプリケーションは、フレームワークでプロパティが必要になるまで、更新されたプロパティ値を照会しました。 たとえば、タブがアクティブ化され、リボン UI にコントロールが表示されたときや、ツールヒントが表示されたときなどです。

注意

場合によっては、 IUIFramework::GetUICommandProperty メソッドを使用してプロパティを取得し、 IUIFramework::SetUICommandProperty メソッドを使用して設定できます。

次の表に、クイック アクセス ツール バー (QAT) コントロールに関連付けられているプロパティ キーの一覧を示します。

プロパティ キー メモ
UI_PKEY_ItemsSource IUIFramework::GetUICommandProperty をサポートします (IUIFramework::SetUICommandProperty はサポートされていません)。IUIFramework::GetUICommandProperty は、QAT 内のコマンドを表す IUICollection オブジェクトへのポインターを返します。 各コマンドは、その Command ID によって識別されます。これは、 IUISimplePropertySet::GetValue メソッドを呼び出し、プロパティ キー UI_PKEY_CommandIdを渡すことによって取得されます。

クイック アクセス ツール バー (QAT) ドロップダウン メニューの [ その他のコマンド ] コマンド項目に関連付けられているプロパティ キーはありません