字型控制項

為了簡化需要文字處理和文字編輯功能之應用程式中字型支援的整合和設定,Windows 功能區架構提供特殊的字型控制項,其會公開各種字型屬性,例如字型名稱、樣式、點大小和效果。

簡介

字型控制項是複合控制項,其中包含按鈕、切換按鈕、下拉式清單方塊和下拉式方塊,全部都用來指定特定字型屬性或格式選項。

下列螢幕擷取畫面顯示 WordPad for Windows 7 的功能區字型控制項。

fontcontrol 元素的螢幕擷取畫面,其中 richfont 屬性設定為 true。

一致的體驗

做為內建功能區控制項,字型控制項可改善整體字型管理、選取和格式化功能,並在所有功能區應用程式中提供豐富的一致使用者體驗。

此一致體驗包括

  • 跨功能區應用程式的標準化格式設定和選取字型。

  • 跨功能區應用程式的標準化字型表示。

  • 自動,在 Windows 7 中,根據[字型] 控制台中每個字型的[顯示] 或 [隱藏]設定來啟用字型。 字型控制項只會顯示設定為 [顯示] 的字型。

    注意

    在 Windows Vista 中, [字型 ] 控制台不提供 [顯示 ] 或 [ 隱藏 ] 功能,因此會啟用所有字型。

  • 可直接從控制項取得的字型管理。

    下列螢幕擷取畫面顯示可以直接從 [字型控制項] 存取 [字 型] 控制台。

    Windows 7 文字板中字型系列清單的螢幕擷取畫面。

  • 支援自動預覽。

  • 公開與使用者最相關的字型,例如

    • 適用于國際使用者的當地語系化字型清單。
    • 根據輸入裝置的字型清單。

    注意

    Windows 7 以外的任何平臺上都無法使用此功能的支援。

輕鬆整合和設定

藉由提供標準、可重複使用且容易取用的功能,功能區字型控制項可簡化將字型支援整合到應用程式中的負擔。

字型選取和格式的詳細資料會包裝在一個獨立的邏輯元素中

  • 消除一般字型控制項實作之控制項相依性的複雜管理。
  • 對於字型控制項子控制項公開的所有功能,都需要單一 Command 處理常式。

這個單一命令處理常式可讓字型控制項在內部管理各種子控制項的功能;不論其函式為何,子控制項永遠不會直接與應用程式互動。

字型控制項的其他功能包括

  • WYSIWYG 的自動 DPI 感知產生 (您在 [字型系列 ] 功能表中取得每個字型) 點陣圖表示。

  • Windows 圖形裝置介面 (GDI) 整合。

  • 當地語系化的字型系列點陣圖和工具提示。

  • 用於管理和呈現字型的字型列舉、群組和中繼資料。

    注意

    Windows 7 以外的任何平臺上都無法使用此功能的支援。

  • [文字色彩] 和 [文字] 醒目提示色彩下拉式選擇器,可鏡像功能區下拉式色彩選擇器行為。

  • 支援所有字型控制項資源庫型子控制項的自動預覽: 字型系列字型大小文字色彩文字醒目提示色彩

與通用 GDI 文字結構對齊

Windows 圖形裝置介面 (GDI) 文字堆疊元件是用來透過功能區字型控制項公開字型選取和格式化功能。 LOGFONT 結構CHOOSEFONT 結構和CHARFORMAT2 結構所支援的各種字型功能會透過字型控制項中包含的子控制項公開。

在字型控制項中顯示的子控制項取決於功能區標記中所宣告的 FontType 範本。 下一節) 進一步討論的 FontType 範本 (是設計來與通用 Windows 圖形裝置介面 (GDI) 文字結構一致。

新增 FontControl

本節概述將字型控制項新增至功能區應用程式的基本步驟。

在標記中宣告 FontControl

與其他功能區控制項一樣,字型控制項會在標記中宣告 FontControl 元素,並透過命令識別碼與 Command 宣告相關聯。 編譯應用程式時,會使用命令識別碼將命令系結至主應用程式中的命令處理常式。

注意

如果沒有在標記中使用 FontControl 宣告命令識別碼,則架構會產生一個。

因為不會直接公開字型控制項的子控制項,所以字型控制項的自訂僅限於架構所定義的三個 FontType 版面配置範本。

藉由結合版面配置範本與 FontControl 屬性,例如 IsHighlightButtonVisibleIsStrikethroughButtonVisibleIsUnderlineButtonVisible,即可完成字型控制項的進一步自訂。

注意

除了標準字型控制項範本和屬性所公開的字型功能之外,還需要超出本文範圍的自訂字型控制項實作。

下表列出每個範本對齊的字型控制項範本和編輯控制項類型。

[範本] 支援
FontOnly LOGFONT 結構
FontWithColor CHOOSEFONT 結構
RichFont CHARFORMAT2 結構

下表列出與每個範本相關聯的控制項,並識別相關聯範本的選擇性控制項。

控制項

範本

RichFont

FontWithColor

FontOnly

預設

選擇性

預設

選擇性

預設

選擇性

字型大小 下拉式方塊

No

No

No

字型系列 下拉式方塊

No

No

No

成長字型 按鈕

Yes

Yes

Yes

Yes

-

-

壓縮字型 按鈕

Yes

Yes

Yes

Yes

-

-

粗體 按鈕

No

No

No

斜體 按鈕

No

No

No

底線 按鈕

No

Yes

Yes

Yes

Yes

刪除線 按鈕

No

Yes

Yes

Yes

Yes

下標 按鈕

No

-

-

-

-

上標 按鈕

No

-

-

-

-

文字醒目提示色彩 按鈕

No

Yes

Yes

-

-

文字色彩 按鈕

No

No

-

-

宣告字型控制項的配置行為時,功能區架構會提供選擇性 的 SizeDefinition 版面配置範本, OneFontControl 根據功能區的大小和字型控制項可用的空間定義兩個子控制群組態。 如需詳細資訊,請參閱 透過大小定義和調整原則自訂功能區

將 FontControl 新增至功能區

下列程式碼範例示範將字型控制項新增至功能區的基本標記需求:

此程式碼區段會顯示FontControl命令宣告標記,包括功能區中顯示控制項所需的Tab群組命令。

<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" />

此程式碼區段顯示透過命令識別碼宣告和建立 FontControlCommand 的關聯所需的標記。 這個特定範例包含具有調整喜好設定的 TabGroup 宣告。

<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>

將 FontControl 新增至 CoNtextPopup

將字型控制項新增至 內容快顯 需要類似將字型控制項新增至功能區的程式。 不過, MiniToolbar 中的字型控制項僅限於所有字型控制項範本通用的預設子控制項集: 字型系列字型大小粗體斜體

下列程式碼範例示範將字型控制項新增至 內容快顯的基本標記需求:

此程式碼區段會顯示在 CoNtextPopup中顯示FontControl 所需的 FontControl命令宣告標記。

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

此程式碼區段顯示透過命令識別碼宣告和建立 FontControl 與 Command 的關聯所需的標記。

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

按鍵提示

功能區字型控制項中的每個子控制項都可以透過鍵盤快速鍵或按鍵提示來存取。 此索引鍵提示是預先定義的,並由架構指派給每個子控制項。

如果將 Keytip 屬性值指派給標記中的 FontControl 元素,這個值會新增為架構定義索引鍵提示的前置詞。

注意

應用程式應針對此前置詞強制執行單一字元規則。

下表列出架構所定義的按鍵提示。

子控制項 Keytip
字型家族 F
字型樣式 T
字型大小 S
成長字型 G
壓縮字型 K
粗體 B
斜體 I
Underline U
刪除線 X
Y 或 Z 附注: 如果未在標記中宣告 Keytip 屬性,則預設索引鍵提示為 Y;否則,預設索引鍵提示為 Keytip + Z。
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"

字型控制項屬性

功能區架構會定義字型控制項及其組成子控制項 的屬性索引鍵 集合。

一般而言,字型控制項屬性會在功能區 UI 中更新,方法是透過呼叫 IUIFramework::InvalidateUICommand 方法,使與控制項相關聯的命令失效。 會處理無效事件,以及 IUICommandHandler::UpdateProperty 回呼方法所定義的屬性更新。

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

注意

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

下表列出與字型控制項相關聯的屬性索引鍵。

屬性索引鍵 備註
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

除了 Font Control 本身支援的屬性之外,功能區架構也會為每個 Font Control 子控制項定義 屬性索引鍵 。 這些屬性索引鍵及其值會透過 IPropertyStore 介面實作公開,此實作會定義管理集合的方法,也稱為名稱與值組的屬性包。

應用程式會將字型結構轉譯為可透過 IPropertyStore 介面方法存取的屬性。 此模型強調字型控制項與 Windows 圖形裝置介面 (GDI) 文字堆疊元件 (LOGFONT 結構CHOOSEFONT 結構和CHARFORMAT2 結構) 由架構支援的區別。

下表列出個別控制項及其相關聯的屬性索引鍵。

控制項 屬性索引鍵 備註
字型大小 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
Underline UI_PKEY_FontProperties_Underline
刪除線 UI_PKEY_FontProperties_Strikethrough
UI_PKEY_FontProperties_VerticalPositioning 如果已設定 [下標 ] 按鈕,則無法同時設定 上標
UI_PKEY_FontProperties_VerticalPositioning 如果已設定 上標 按鈕,則無法同時設定 下標
文字醒目提示色彩 UI_PKEY_FontProperties_BackgroundColorUI_PKEY_FontProperties_BackgroundColorType 提供與 HighlightColorsDropDownColorPicker 元素範本相同的功能。
強烈建議應用程式只設定初始 文字醒目提示色彩 值。 在檔內重新置放游標時,應該保留最後一個選取的值,而不會設定。 這可讓您快速存取使用者的最後一個選取專案,而且不需要重新開啟色彩選擇器。
無法自訂色彩樣板。
文字色彩 UI_PKEY_FontProperties_ForegroundColorUI_PKEY_FontProperties_ForegroundColorType 提供與 StandardColorsDropDownColorPicker 元素範本相同的功能。
強烈建議應用程式只設定初始 文字色彩 值。 在檔內重新置放游標時,應該保留最後一個選取的值,而不會設定。 這可讓您快速存取使用者的最後一個選取專案,而且不需要重新開啟色彩選擇器。
無法自訂色彩樣板。

定義 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 範例