次の方法で共有


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

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

はじめに

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

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

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

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

Note

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

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

クイック アクセス ツール バーの実装

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

マークアップ

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

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

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

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

[その他のコマンド] コマンド項目のある QAT メニューのスクリーン ショット。

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

クイック アクセス ツール バー (QAT) のツール バー内にあるアプリケーション既定値の一覧からコマンドを表示するには、各コントロール要素の ApplicationDefaults.IsChecked 属性の値が true である必要があります。 上の図には、Save コマンド、Undo コマンド、および Redo コマンドのこの属性を true に設定した結果を示しています。

QuickAccessToolbar.ApplicationDefaults では、ButtonToggle Button、およびCheck Box の 3 種類のリボン コントロールがサポートされます。

Note

Windows 8 以降: ギャラリーベースのコントロールはすべてサポートされています (ComboBoxInRibbonGallerySplitButtonGallery、および DropDownGallery)。

ギャラリー コントロール内の項目では、ポイント時の強調表示がサポートされます。 ポイント時の強調表示をサポートするには、ギャラリーが項目のギャラリーであり、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) に追加することはできません。

Note

リボン アプリケーションでは、クイック アクセス ツール バー (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 メソッドの呼び出しを介して、コントロールに関連付けられているコマンドを無効にします。 IUICommandHandler::UpdateProperty コールバック メソッドによって、無効化イベントは処理され、プロパティは更新されます。

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

Note

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

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

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

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