字型控件
為了簡化需要文字處理和文字編輯功能之應用程式中字型支援的整合和設定,Windows 功能區架構提供特殊的字型控件,可公開各種字型屬性,例如字樣名稱、樣式、點號和效果。
介紹
字型控件是複合控件,其中包含按鈕、切換按鈕、下拉式清單框和下拉式方塊,這些控件全都用來指定特定的字型屬性或格式設定選項。
下列螢幕快照顯示適用於 Windows 7 的 WordPad 功能區字型控制件。
一致的體驗
作為內建功能區控件,字型控件可改善整體字型管理、選取和格式設定功能,並提供豐富且一致的用戶體驗。所有功能區應用程式。
此一致體驗包括
跨功能區應用程式的標準化格式設定和選取字型。
跨功能區應用程式的標準化字型表示。
在 Windows 7 中,根據 [顯示] 或 [隱藏] 設定,在 windows 7 中,會啟用 字型 控制面板中的每個字型。 字型控件只會顯示設定為 Show的字型。
注意
在 Windows Vista 中,字型 控制面板不提供 顯示 或 隱藏 功能,因此會啟動所有字型。
可直接從控件取得的字型管理。
下列螢幕快照顯示可以直接從 [字型控件] 存取 Fonts 控制面板。
支援自動預覽。
與使用者最相關的字型曝光,例如
- 適用於國際使用者的當地語系化字型清單。
- 根據輸入裝置的字型清單。
注意
Windows 7 以外的任何平臺上都無法使用此功能的支援。
輕鬆整合和設定
透過提供標準、可重複使用且容易取用的功能,功能區字型控件可減輕將字型支援整合到應用程式中的負擔。
字型選取和格式的詳細數據會包裝在一個獨立邏輯元素中
- 排除字型控件實作中常見的控件相互依存性的複雜管理。
- 對於字型控件子控件所公開的所有功能,需要單一 Command 處理程式。
這個單一命令處理程式可讓字型控件在內部管理各種子控件的功能;不論其函式為何,子控件永遠不會直接與應用程式互動。
字型控件的其他功能包括
WYSIWYG 自動、DPI 感知產生(您看到的內容是所得到的),Font 系列 功能表中每個字型的點陣圖表示法。
本地化的字型系列點陣圖和工具提示。
用於管理和呈現字型的字型列舉、群組和元數據。
注意
Windows 7 以外的任何平臺上都無法使用這項功能的支援。
文字色彩 和 文字反白顯示色彩 下拉式色彩選擇器,以反映功能區 Drop-Down 色彩選擇器 行為。
支援所有字型控件庫型子控件的自動預覽:字型系列、字型大小、文字色彩,以及 文字醒目提示色彩。
與通用 GDI 文字結構對齊
Windows 圖形裝置介面 (GDI) 文字堆疊元件可用來透過功能區字型控件公開字型選取和格式化功能。 LOGFONT 結構、CHOOSEFONT 結構支援的各種字型功能,以及 CHARFORMAT2 Structure 會透過字型控件中包含的子控件公開。
顯示在字型控件中的子控件取決於功能區標記中宣告的 FontType 範本。 FontType 範本(在下一節中進一步詳細討論)是設計來配合一般 Windows Graphics Device Interface (GDI) 文字結構。
新增 FontControl
本節概述將字型控件新增至功能區應用程式的基本步驟。
在標記中宣告 FontControl
與其他功能區控件一樣,字型控件會在標記中宣告 FontControl 元素,並透過命令標識元與 Command 宣告相關聯。 編譯應用程式時,命令標識符會用來將命令系結至主應用程式中的 Command 處理程式。
注意
如果沒有使用標記中的 FontControl 宣告命令標識碼,則架構會產生一個命令標識符。
由於不會直接公開字型控件的子控件,因此字型控件的自定義限制為三個 FontType 架構所定義的版面配置範本。
藉由結合版面配置範本與 FontControl 屬性,例如 IsHighlightButtonVisible、IsStrikethroughButtonVisible和 IsUnderlineButtonVisible,即可完成字型控件的進一步自定義。
注意
超出標準字型控件範本和屬性所公開的字型功能,需要超出本文範圍的自定義字型控件實作。
下表列出每個範本所對齊的字型控件範本和編輯控件類型。
範本 | 支援 |
---|---|
FontOnly | LOGFONT 結構 |
FontWithColor | CHOOSEFONT 結構 |
RichFont | CHARFORMAT2 結構 |
下表列出與每個範本相關聯的控制項,並識別關聯範本的選擇性控件。
控制
範本
RichFont
FontWithColor
FontOnly
違約
自選
違約
自選
違約
自選
下拉式方塊 字型大小
是的
不
是的
不
是的
不
字型系列 下拉式方塊
是的
不
是的
不
是的
不
放大字型 按鈕
是的
是的
是的
是的
-
-
縮小字型 按鈕
是的
是的
是的
是的
-
-
粗體 按鈕
是的
不
是的
不
是的
不
斜體 按鈕
是的
不
是的
不
是的
不
底線 按鈕
是的
不
是的
是的
是的
是的
刪除線 按鈕
是的
不
是的
是的
是的
是的
下標 按鈕
是的
不
-
-
-
-
上標 按鈕
是的
不
-
-
-
-
文字醒目提示色彩 按鈕
是的
不
是的
是的
-
-
文字色彩 按鈕
是的
不
是的
不
-
-
宣告字型控件的配置行為時,功能區架構會根據功能區的大小和字型控件可用的空間,提供選擇性的 SizeDefinition 版面配置範本,OneFontControl
定義兩個子控件元件元件。 如需詳細資訊,請參閱 透過大小定義自定義功能區及調整原則。
將 FontControl 新增至功能區
下列程式代碼範例示範將字型控件新增至功能區的基本標記需求:
此區段的程式代碼顯示 FontControl Command 宣告標記,包括 Tab 和 Group 命令,這些命令需要在 功能區中顯示控件。
<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" />
此區段的程式代碼顯示宣告和關聯 FontControl 與透過命令標識碼 Command 所需的標記。 這個特定範例包含具有縮放喜好設定的 Tab 和 Group 宣告。
<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 中的字型控件僅限於所有字型控件範本通用的預設子控件集:字型系列、字型、粗體,以及 斜體。
下列程式代碼範例示範將字型控件新增至 內容快顯的基本標記需求:
此區段的程式代碼顯示 FontControl Command 宣告標記,在 ContextPopup中顯示 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 |
斜體的 | 我 |
下劃線 | U |
刪除線 | X |
上標 | Y 或 Z 注意: 如果標記中未宣告 Keytip 屬性,則預設索引鍵提示為 Y;否則,預設索引鍵提示會 Keytip + Z。 |
下標 | 一個 |
字型色彩 | C |
字型醒目提示 | H |
多語系使用者介面 (MUI) EN-US 功能區的建議前置詞是 『F』,如下列範例所示。
<Command Name="cmdFontControl" Symbol="cmdFontControl" Comment="FontControl" Id="25001" Keytip="F" />
下列螢幕快照說明字型控件按鍵提示,如上一個範例中所定義。
功能區資源檔
編譯標記檔案時,會產生包含功能區應用程式之所有資源參考的資源檔。
簡單資源檔案的範例:
// ******************************************************************************
// * 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 物件的形式公開所有字型控件子控件屬性。 當 UI_INVALIDATIONS_VALUE 傳遞為呼叫 IUIFramework::InvalidateUICommand時,架構會查詢這個屬性 旗標的值。 |
UI_PKEY_FontProperties_ChangedProperties | 以 IUISimplePropertySet 物件的形式公開,只公開已變更的字型控件子控件屬性。 |
UI_PKEY_Keytip | 只能透過無效更新。 |
UI_PKEY_Enabled | 支援 IUIFramework::GetUICommandProperty 和 IUIFramework::SetUICommandProperty。 |
除了字型控件本身支援的屬性之外,功能區架構也會為每個字型控件子控件定義 屬性索引鍵。 這些屬性索引鍵及其值是由架構透過 IPropertyStore 介面實作來公開,這些介面實作會定義管理集合的方法,也稱為名稱與值組的屬性包。
應用程式會將字型結構轉譯為可透過 IPropertyStore 介面方法存取的屬性。 此模型強調字型控件與 Windows 圖形裝置介面 (GDI) 文字堆疊元件(LOGFONT 結構、CHOOSEFONT 結構,以及架構支援的 CHARFORMAT2 結構)。
下表列出個別控件及其相關聯的屬性索引鍵。
控制 | 屬性索引鍵 | 筆記 |
---|---|---|
字型大小 | UI_PKEY_FontProperties_Size | 當反白顯示異質大小文字的執行時,功能區架構會將 字型大小 控件設定為空白,並將 UI_PKEY_FontProperties_Size 的值設定為 0。 按兩下 [放大] 字型 或 [壓縮字型] 按鈕時,會調整所有反白顯示的文字大小,但會保留文字大小之間的相對差異。 |
Font 系列 | UI_PKEY_FontProperties_Family | GDI 字型系列名稱會隨著系統地區設定而有所不同。 因此,如果跨應用程式會話保留 UI_PKEY_FontProperties_Family 的值,則應該在每個新的會話上擷取該值。 |
放大縮小字體 功能 放大縮小字體功能 | UI_PKEY_FontProperties_Size | 請參閱 字型大小。 |
壓縮字型 | UI_PKEY_FontProperties_Size | 請參閱 字型大小。 |
Bold | UI_PKEY_FontProperties_Bold | |
斜體 | UI_PKEY_FontProperties_Italic | |
底線 | UI_PKEY_FontProperties_Underline | |
罷工 | UI_PKEY_FontProperties_Strikethrough | |
下標 | UI_PKEY_FontProperties_VerticalPositioning | 如果 下標 按鈕已設定,則也無法設定 上標。 |
上標 | UI_PKEY_FontProperties_VerticalPositioning | 如果已設定 [上標] 按鈕,則也無法設定 下標。 |
文字醒目提示色彩 | UI_PKEY_FontProperties_BackgroundColor、UI_PKEY_FontProperties_BackgroundColorType | 提供與 DropDownColorPicker 元素 HighlightColors 範本相同的功能。強烈建議應用程式只設定初始 文字醒目提示色彩 值。 最後一個選取的值應該保留,而不是在檔內重新定位游標時設定。 這可讓您快速存取使用者的最後一個選取專案,而且色彩選擇器不需要重新開啟。 無法自訂色彩色板。 |
文字色彩 | UI_PKEY_FontProperties_ForegroundColor、UI_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;
}