フォント コントロール

Windows リボン フレームワークは、ワープロ機能とテキスト編集機能を必要とするアプリケーションでのフォント サポートの統合と構成を簡略化するために、書体名、スタイル、ポイント サイズ、効果など、さまざまなフォント プロパティを公開する特殊なフォント コントロールを提供します。

はじめに

フォント コントロールは、ボタン、トグル ボタン、ドロップダウン リスト ボックス、コンボ ボックスで構成される複合コントロールです。これらはすべて、特定のフォント プロパティまたは書式設定オプションを指定するために使用されます。

次のスクリーン ショットは、Windows 7 用ワードパッドのリボン フォント コントロールを示しています。

richfont 属性が true に設定されている fontcontrol 要素のスクリーン ショット。

一貫性のあるエクスペリエンス

組み込みのリボン コントロールとして、フォント コントロールは全体的なフォント管理、選択、書式設定機能を向上させ、すべてのリボン アプリケーションで一貫性のある豊富なユーザー エクスペリエンスを提供します。

この一貫性のあるエクスペリエンスには、次のものが含まれます。

  • リボン アプリケーション全体でのフォントの標準化された書式設定と選択。

  • リボン アプリケーション全体で標準化されたフォント表現。

  • Windows 7 では、[フォント] コントロール パネルの各フォントの [表示] または [非表示] 設定に基づくフォントのアクティブ化が自動的に行われます。 [フォント コントロール] には、[ 表示] に設定されているフォントのみが表示されます。

    注意

    Windows Vista では、[ フォント ] コントロール パネルには [表示 ] または [ 非表示] 機能がないため、すべてのフォントがアクティブになります。

  • コントロールから直接使用できるフォント管理。

    次のスクリーン ショットは、[フォント] コントロール パネルに [ フォント コントロール] から直接アクセスできることを示しています。

    Windows 7 のワードパッドのフォント ファミリ リストのスクリーン ショット。

  • 自動プレビューのサポート。

  • ユーザーに最も関連性の高いフォント (例:

    • 国際ユーザー向けのローカライズされたフォント リスト。
    • 入力デバイスに基づくフォント リスト。

    注意

    この機能のサポートは、Windows 7 より古いプラットフォームでは使用できません。

簡単な統合と構成

リボン フォント コントロールは、標準的で再利用可能で使いやすい機能を提供することで、フォント サポートをアプリケーションに統合する負担を軽減します。

フォントの選択と書式設定の詳細は、1 つの自己完結型論理要素にラップされます。

  • フォント コントロールの実装に典型的なコントロール相互依存の複雑な管理を排除します。
  • Font Control サブコントロールによって公開されるすべての機能に対して、1 つの Command ハンドラーが必要です。

この 1 つのコマンド ハンドラーを使用すると、フォント コントロールは、さまざまなサブコントロールの機能を内部的に管理できます。サブコントロールは、その関数に関係なく、アプリケーションと直接対話することはありません。

フォント コントロールのその他の機能は次のとおりです。

  • [ フォント ファミリ ] メニューの各フォントの WYSIWYG (表示される内容) ビットマップ表現の DPI 対応の自動生成。

  • Windows グラフィックス デバイス インターフェイス (GDI) の統合。

  • ローカライズされたフォント ファミリのビットマップとヒント。

  • フォントを管理および表示するためのフォント列挙、グループ化、およびメタデータ。

    注意

    この機能のサポートは、Windows 7 より古いプラットフォームでは使用できません。

  • [テキストの色] と [テキストの強調表示] の [色] ドロップダウンの色選択ウィンドウで、リボンのドロップダウン カラー ピッカーの動作をミラーします。

  • フォント ファミリ、フォント サイズテキストの色、テキストの強調表示の色など、すべてのフォント コントロール ギャラリー ベースのサブコントロールによる自動プレビューのサポート。

一般的な GDI テキスト構造との配置

Windows グラフィックス デバイス インターフェイス (GDI) テキスト スタック コンポーネントは、リボン のフォント コントロールを使用してフォントの選択と書式設定機能を公開するために使用されます。 LOGFONT 構造体、CHOOSEFONT 構造体および CHARFORMAT2構造体でサポートされているさまざまなフォント機能は、フォント コントロールに含まれるサブコントロールを介して公開されます。

フォント コントロールに表示されるサブコントロールは、リボン マークアップで宣言されている FontType テンプレートによって異なります。 FontType テンプレート (以降のセクションで詳しく説明します) は、一般的な Windows グラフィックス デバイス インターフェイス (GDI) テキスト構造に合わせて設計されています。

FontControl を追加する

このセクションでは、リボン アプリケーションにフォント コントロールを追加するための基本的な手順について説明します。

マークアップでの FontControl の宣言

他のリボン コントロールと同様に、Font Control は FontControl 要素を使用してマークアップで宣言され、Command ID を介して Command 宣言に関連付けられます。 アプリケーションがコンパイルされると、コマンド ID を使用して、ホスト アプリケーションの Command ハンドラーに Command がバインドされます。

注意

マークアップで FontControl を使用してコマンド ID が宣言されていない場合は、フレームワークによって生成されます。

フォント コントロールのサブコントロールは直接公開されないため、フォント コントロールのカスタマイズは、フレームワークによって定義された 3 つの FontType レイアウト テンプレートに制限されます。

フォント コントロールをさらにカスタマイズするには、レイアウト テンプレートと、IsHighlightButtonVisibleIsStrikethroughButtonVisibleIsUnderlineButtonVisible などの FontControl 属性を組み合わせて使用できます。

注意

標準のフォント コントロール テンプレートと属性によって公開される以外のフォント機能には、この記事の範囲外のカスタム フォント コントロールの実装が必要です。

次の表に、フォント コントロール テンプレートと、各テンプレートが配置されている編集コントロールの種類を示します。

Template サポート
FontOnly LOGFONT 構造体
FontWithColor CHOOSEFONT 構造体
RichFont CHARFORMAT2 構造体

次の表に、各テンプレートに関連付けられているコントロールの一覧を示し、関連付けられたテンプレートに対して省略可能なコントロールを示します。

コントロール

テンプレート

RichFont

FontWithColor

FontOnly

Default

省略可能

Default

省略可能

Default

Optional

[フォント サイズ ] コンボ ボックス

いいえ

いいえ

いいえ

[フォント ファミリ ] コンボ ボックス

いいえ

いいえ

いいえ

[フォントの拡大 ] ボタン

はい

-

-

[フォントの縮小 ] ボタン

はい

-

-

太字 ボタン

いいえ

はい

いいえ

いいえ

斜体 ボタン

いいえ

いいえ

いいえ

下線 ボタン

いいえ

はい

はい

はい

取り消し線 ボタン

いいえ

はい

はい

下付き文字 ボタン

はい

いいえ

-

-

-

-

上付きボタン

いいえ

-

-

-

-

[テキストの強調表示の色 ] ボタン

いいえ

-

-

[テキストの色] ボタン

いいえ

いいえ

-

-

フォント コントロールのレイアウト動作が宣言されている場合、リボン フレームワークにはオプションの SizeDefinition レイアウト テンプレート が用意されています。このテンプレートでは、 OneFontControlリボンのサイズとフォント コントロールで使用できる領域に基づいて 2 つのサブコントロール構成が定義されます。 詳細については、「 サイズ定義とスケーリング ポリシーによるリボンのカスタマイズ」を参照してください。

リボンへの FontControl の追加

次のコード例は、リボンにフォント コントロールを追加するための基本的なマークアップ要件を示しています。

このコード セクションでは、リボンにコントロールを表示するために必要な Tab コマンドやグループ コマンドなど、FontControl コマンド宣言マークアップを示します。

<Command Name="cmdTab1"
  Comment="These comments are optional and are inserted into the header file."
  Symbol="cmdTab1" Id="10000" >
  <Command.LabelTitle>Tab 1</Command.LabelTitle>
</Command>
<Command Name="cmdGroup1" Comment="Group #1" Symbol="cmdGroup1" Id="20000">
  <!-- This image is used when the group scales to a pop-up. -->
  <Command.SmallImages>
    <Image>res/Button_Image.bmp</Image>
  </Command.SmallImages>
</Command>
<Command Name="cmdFontControl" Symbol="cmdFontControl" Comment="FontControl" Id="25001" Keytip="F" />

コードのこのセクションでは、Command ID を使用して FontControl を宣言して コマンド に関連付けるために必要なマークアップを示します。 この特定の例には、 タブ 宣言と グループ 宣言とスケーリング設定が含まれます。

<Ribbon.Tabs>
  <Tab CommandName="cmdTab1">
    <Tab.ScalingPolicy>
      <ScalingPolicy>
        <ScalingPolicy.IdealSizes>
          <Scale Group="cmdGroup1" Size="Large" />
        </ScalingPolicy.IdealSizes>
        <!-- Describe how the FontControl group scales. -->
        <Scale Group="cmdGroup1" Size="Medium" />
        <Scale Group="cmdGroup1" Size="Popup" />
      </ScalingPolicy>
    <Group CommandName="cmdGroup1" SizeDefinition="OneFontControl">
      <FontControl CommandName="cmdFontControl" FontType="RichFont" />
    </Group>
  </Tab>
</Ribbon.Tabs>

ContextPopup への FontControl の追加

コンテキスト ポップアップにフォント コントロールを追加するには、リボンにフォント コントロールを追加する手順と同様の手順が必要です。 ただし、 MiniToolbar のフォント コントロールは、すべてのフォント コントロール テンプレートに共通する既定のサブコントロールのセット ( フォント ファミリフォント サイズ太字斜体) に制限されます。

次のコード例は、 コンテキスト ポップアップにフォント コントロールを追加するための基本的なマークアップ要件を示しています。

このコード セクションでは、ContextPopupで FontControl を表示するために必要な FontControl コマンド宣言マークアップを示します。

<Command Name="cmdFontControl" Symbol="cmdFontControl" Comment="FontControl" Id="25001" />

コードのこのセクションでは、Command ID を使用して FontControl を宣言してコマンドに関連付けるために必要なマークアップを示します。

<ContextPopup.MiniToolbars>
  <MiniToolBar Name="MiniToolbar1">
    <MenuCategory Class="StandardItems">
      <FontControl CommandName="cmdFontControl" />
    </MenuCategory>
  </MiniToolBar>
</ContextPopup.MiniToolbars>

Keytips

リボン フォント コントロールの各サブコントロールには、キーボード ショートカットまたはキーヒントを使用してアクセスできます。 このキーヒントは定義済みであり、フレームワークによって各サブコントロールに割り当てられます。

Keytip 属性値がマークアップの FontControl 要素に割り当てられている場合、この値はフレームワーク定義のキーヒントのプレフィックスとして追加されます。

注意

アプリケーションでは、このプレフィックスに 1 文字の規則を適用する必要があります。

次の表に、フレームワークで定義されているキーヒントの一覧を示します。

サブコントロール Keytip
フォント ファミリ F
[フォント スタイル] T
フォント サイズ S
フォントを拡大する G
フォントの縮小 K
太字 B
[斜体] I
Underline U
取り消し線 X
Superscript Y または Z 注:Keytip 属性がマークアップで宣言されていない場合、既定のキーヒントは Y です。それ以外の場合、既定のキーヒントは Keytip + Z です。
Subscript A
フォントの色 C
フォントの強調表示 H

次の例に示すように、多言語ユーザー インターフェイス (MUI) EN-US リボンの推奨されるプレフィックスは 'F' です。

<Command Name="cmdFontControl" Symbol="cmdFontControl" Comment="FontControl" Id="25001" Keytip="F" />

次のスクリーン ショットは、前の例で定義したフォント コントロールキーヒントを示しています。

Windows 7 のワードパッドの fontcontrol キーヒントのスクリーン ショット。

リボン リソース ファイル

マークアップ ファイルがコンパイルされると、リボン アプリケーションのすべてのリソース参照を含むリソース ファイルが生成されます。

単純なリソース ファイルの例:

// ******************************************************************************
// * This is an automatically generated file containing the ribbon resource for *
// * your application.                                                          *
// ******************************************************************************

#include ".\ids.h"

STRINGTABLE 
BEGIN
  cmdTab1_LabelTitle_RESID L"Tab 1" 
    /* LabelTitle cmdTab1_LabelTitle_RESID: These comments are optional and are 
       inserted into the header file. */
END

cmdGroup1_SmallImages_RESID    BITMAP    "res\\Button_Image.bmp" 
  /* SmallImages cmdGroup1_SmallImages_RESID: Group #1 */
STRINGTABLE 
BEGIN
  cmdFontControl_Keytip_RESID L"F" /* Keytip cmdFontControl_Keytip_RESID: FontControl */
END

FCSAMPLE_RIBBON    UIFILE    "Debug\\FCSample.bml"

フォント コントロールのプロパティ

リボン フレームワークは、フォント コントロールとその構成要素のサブコントロールの プロパティ キー のコレクションを定義します。

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

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

注意

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

次の表に、フォント コントロールに関連付けられているプロパティ キーの一覧を示します。

プロパティ キー Notes
UI_PKEY_FontProperties IPropertyStore オブジェクトとして集計された、すべての Font Control サブコントロール プロパティを公開します。
フレームワークは、IUIFramework::InvalidateUICommand の呼び出しで フラグの値として が渡されたときにUI_INVALIDATIONS_VALUE、このプロパティを照会します。
UI_PKEY_FontProperties_ChangedProperties IUISimplePropertySet オブジェクトとして集計で、変更された Font Control サブコントロール プロパティのみを公開します。
UI_PKEY_Keytip 無効化によってのみ更新できます。
UI_PKEY_Enabled IUIFramework::GetUICommandPropertyIUIFramework::SetUICommandProperty をサポートします。

リボン フレームワークでは、フォント コントロール自体でサポートされるプロパティに加えて、各フォント コントロール サブコントロールの プロパティ キー も定義します。 これらのプロパティ キーとその値は、名前と値のペアのプロパティ バッグとも呼ばれるコレクションを管理するためのメソッドを定義する IPropertyStore インターフェイス実装を通じてフレームワークによって公開されます。

アプリケーションは、フォント構造を IPropertyStore インターフェイス メソッドを介してアクセスできるプロパティに変換します。 このモデルでは、フレームワークでサポートされているフォント コントロールと Windows グラフィックス デバイス インターフェイス (GDI) テキスト スタック コンポーネント (LOGFONT 構造体CHOOSEFONT 構造体CHARFORMAT2 構造体) の違いを強調しています。

次の表に、個々のコントロールとそれに関連付けられているプロパティ キーの一覧を示します。

コントロール プロパティ キー Notes
[フォント サイズ] UI_PKEY_FontProperties_Size 異種サイズのテキストの実行が強調表示されている場合、リボン フレームワークは 、フォント サイズ コントロールを空白に設定し、 UI_PKEY_FontProperties_Size の値を 0 に設定します。 [ フォントの拡大 ] または [ フォントの縮小 ] ボタンをクリックすると、強調表示されているすべてのテキストのサイズが変更されますが、テキスト サイズの相対的な違いは保持されます。
フォント ファミリ UI_PKEY_FontProperties_Family GDI フォント ファミリ名は、システム ロケールによって異なります。 そのため、 UI_PKEY_FontProperties_Family の値がアプリケーション セッション間で保持されている場合は、その値を新しいセッションごとに取得する必要があります。
フォントを拡大する UI_PKEY_FontProperties_Size 「フォント サイズ」を参照してください。
フォントの縮小 UI_PKEY_FontProperties_Size 「フォント サイズ」を参照してください。
太字 UI_PKEY_FontProperties_Bold
斜体 UI_PKEY_FontProperties_Italic
下線 UI_PKEY_FontProperties_Underline
取り消し線 UI_PKEY_FontProperties_Strikethrough
Subscript UI_PKEY_FontProperties_VerticalPositioning [下付き文字] ボタンが設定されている場合、上付き文字も設定できません。
Superscript UI_PKEY_FontProperties_VerticalPositioning [上付き文字] ボタンが設定されている場合、下付き文字も設定できません。
テキストの強調表示の色 UI_PKEY_FontProperties_BackgroundColorUI_PKEY_FontProperties_BackgroundColorType DropDownColorPicker 要素のHighlightColorsテンプレートと同じ機能を提供します。
アプリケーションでは、最初の テキスト強調表示の色 の値のみを設定することを強くお勧めします。 最後に選択した値は保持し、文書内でカーソルの位置を変更する場合は設定しないでください。 これにより、ユーザーの最後の選択にすばやくアクセスでき、カラー ピッカーを再度開く必要はありません。
カラー見本はカスタマイズできません。
テキストの色 UI_PKEY_FontProperties_ForegroundColorUI_PKEY_FontProperties_ForegroundColorType DropDownColorPicker 要素のStandardColorsテンプレートと同じ機能を提供します。
アプリケーションでは、初期 のテキスト色 の値のみを設定することを強くお勧めします。 最後に選択した値は保持し、文書内でカーソルの位置を変更する場合は設定しないでください。 これにより、ユーザーの最後の選択にすばやくアクセスでき、カラー ピッカーを再度開く必要はありません。
カラー見本はカスタマイズできません。

FontControl コマンド ハンドラーを定義する

このセクションでは、フォント コントロールをコマンド ハンドラーにバインドするために必要な手順について説明します。

警告

フォント コントロールのカラー ピッカーからカラー 見本を選択しようとすると、コントロールにコマンド ハンドラーが関連付けられていない場合、アクセス違反が発生する可能性があります。

次のコード例では、マークアップで宣言されているコマンドを Command ハンドラーにバインドする方法を示します。

//
//  FUNCTION: OnCreateUICommand(UINT, UI_COMMANDTYPE, IUICommandHandler)
//
//  PURPOSE: Called by the Ribbon framework for each command specified in markup, to allow
//           the host application to bind a command handler to that command.
//
STDMETHODIMP CApplication::OnCreateUICommand(
  UINT nCmdID,
  __in UI_COMMANDTYPE typeID,
  __deref_out IUICommandHandler** ppCommandHandler)
{
  UNREFERENCED_PARAMETER(typeID);
  UNREFERENCED_PARAMETER(nCmdID);

  if (NULL == m_pCommandHandler)
  {
    HRESULT hr = CCommandHandler::CreateInstance(&m_pCommandHandler);
    if (FAILED(hr))
    {
      return hr;
    }
  }

  return m_pCommandHandler->QueryInterface(IID_PPV_ARGS(ppCommandHandler));
}

次のコード例は、フォント コントロールの IUICommandHandler::Execute メソッドを実装する方法を示しています。

//
//  FUNCTION: Execute()
//
//  PURPOSE: Called by the Ribbon framework when a command is executed 
//           by the user. For example, when a button is pressed.
//
STDMETHODIMP CCommandHandler::Execute(
  UINT nCmdID,
  UI_EXECUTIONVERB verb,
  __in_opt const PROPERTYKEY* key,
  __in_opt const PROPVARIANT* ppropvarValue,
  __in_opt IUISimplePropertySet* pCommandExecutionProperties)
{
  UNREFERENCED_PARAMETER(nCmdID);

  HRESULT hr = E_NOTIMPL;
  if ((key) && (*key == UI_PKEY_FontProperties))
  {
    // Font properties have changed.
    switch (verb)
    {
      case UI_EXECUTIONVERB_EXECUTE:
      {
        hr = E_POINTER;
        if (pCommandExecutionProperties != NULL)
        {
          // Get the changed properties.
          PROPVARIANT varChanges;
          hr = pCommandExecutionProperties->GetValue(UI_PKEY_FontProperties_ChangedProperties, &varChanges);
          if (SUCCEEDED(hr))
          {
            IPropertyStore *pChanges;
            hr = UIPropertyToInterface(UI_PKEY_FontProperties, varChanges, &pChanges);
            if (SUCCEEDED(hr))
            {
              // Using the changed properties, set the new font on the selection on RichEdit control.
              g_pFCSampleAppManager->SetValues(pChanges);
              pChanges->Release();
            }
            PropVariantClear(&varChanges);
          }
        }
        break;
      }
      case UI_EXECUTIONVERB_PREVIEW:
      {
        hr = E_POINTER;
        if (pCommandExecutionProperties != NULL)
        {
          // Get the changed properties for the preview event.
          PROPVARIANT varChanges;
          hr = pCommandExecutionProperties->GetValue(UI_PKEY_FontProperties_ChangedProperties, &varChanges);
          if (SUCCEEDED(hr))
          {
            IPropertyStore *pChanges;
            hr = UIPropertyToInterface(UI_PKEY_FontProperties, varChanges, &pChanges);
            if (SUCCEEDED(hr))
            {
              // Set the previewed values on the RichEdit control.
              g_pFCSampleAppManager->SetPreviewValues(pChanges);
              pChanges->Release();
            }
            PropVariantClear(&varChanges);
          }
        }
        break;
      }
      case UI_EXECUTIONVERB_CANCELPREVIEW:
      {
        hr = E_POINTER;
        if (ppropvarValue != NULL)
        {
          // Cancel the preview.
          IPropertyStore *pValues;
          hr = UIPropertyToInterface(UI_PKEY_FontProperties, *ppropvarValue, &pValues);
          if (SUCCEEDED(hr))
          {   
            g_pFCSampleAppManager->CancelPreview(pValues);
            pValues->Release();
          }
        }
        break;
      }
    }
  }

  return hr;
}

次のコード例は、フォント コントロールの IUICommandHandler::UpdateProperty メソッドを実装する方法を示しています。

//
//  FUNCTION: UpdateProperty()
//
//  PURPOSE: Called by the Ribbon framework when a command property (PKEY) needs to be updated.
//
//  COMMENTS:
//
//    This function is used to provide new command property values, such as labels, icons, or
//    tooltip information, when requested by the Ribbon framework.  
//    
//
STDMETHODIMP CCommandHandler::UpdateProperty(
  UINT nCmdID,
  __in REFPROPERTYKEY key,
  __in_opt const PROPVARIANT* ppropvarCurrentValue,
  __out PROPVARIANT* ppropvarNewValue)
{
  UNREFERENCED_PARAMETER(nCmdID);

  HRESULT hr = E_NOTIMPL;
  if (key == UI_PKEY_FontProperties)
  {
    hr = E_POINTER;
    if (ppropvarCurrentValue != NULL)
    {
      // Get the font values for the selected text in the font control.
      IPropertyStore *pValues;
      hr = UIPropertyToInterface(UI_PKEY_FontProperties, *ppropvarCurrentValue, &pValues);
      if (SUCCEEDED(hr))
      {
        g_pFCSampleAppManager->GetValues(pValues);

        // Provide the new values to the font control.
        hr = UIInitPropertyFromInterface(UI_PKEY_FontProperties, pValues, ppropvarNewValue);
        pValues->Release();
      }
    }
  }

  return hr;
}

Windows リボン フレームワーク コントロール ライブラリ

FontControl 要素

フォント コントロールのプロパティ

FontControl サンプル