文字格式設定和版面配置
DirectWrite 提供兩個格式化文字的介面:IDWriteTextFormat 和 IDWriteTextLayout。 IDWriteTextFormat 只會描述文字的格式,而且當整個字串是相同的字型大小、樣式、粗細等等時,就會使用。 另一方面,IDWriteTextLayout 封裝文字字串和指定字串範圍的格式。 本文件說明每個介面及其用法。 如需這些介面建立和方法的詳細資訊,請參閱 IDWriteTextFormat 和 IDWriteTextLayout 參考頁面。
本檔案包含下列部分:
IDWriteTextFormat
IDWriteTextFormat 物件可用來:
- 描述轉譯時整個字串的格式。 若要轉譯具有多種格式的字串,請使用 IDWriteTextLayout 物件。
- 建立 IDWriteTextLayout 物件時,請指定預設的文字格式。
若要建立 IDWriteTextFormat 物件,您可以使用 IDWriteFactory::CreateTextFormat 方法,並指定字型系列、字型集合、字型粗細、字型(以 DIP 為單位),地區設定名稱。
修改 IDWriteTextFormat
建立 IDWriteTextFormat 介面之後,就無法變更某些值:字型系列、集合、粗細和大小,以及地區設定名稱。 若要變更這些值,必須建立新的 IDWriteTextFormat 物件。
IDWriteTextLayout 可讓您變更上述屬性,而不需要重新建立任何專案。 IDWriteTextFormat 可讓您進行套用至整個文字的格式變更,例如文字對齊方式。 如果您想要將格式設定套用至特定字元範圍,您應該使用 IDWriteTextLayout來執行此動作。
IDWriteTextFormat 提供方法來設定文字對齊、流程方向、累加製表位、行距、段落對齊、修剪和換行。 這些屬性可以在建立 IDWriteTextFormat 對象之後隨時變更。
IDWriteTextLayout
IDWriteTextLayout 介面,不同於 IDWriteTextFormat,代表文字區塊和相關聯的格式。 IDWriteTextFormat 代表初始格式資訊。 下列範例示範如何使用 IDWriteFactory::CreateTextLayout建立 IDWriteTextLayout 物件。
// Create a text layout using the text format.
if (SUCCEEDED(hr))
{
RECT rect;
GetClientRect(hwnd_, &rect);
float width = rect.right / dpiScaleX_;
float height = rect.bottom / dpiScaleY_;
hr = pDWriteFactory_->CreateTextLayout(
wszText_, // The string to be laid out and formatted.
cTextLength_, // The length of the string.
pTextFormat_, // The text format to apply to the string (contains font information, etc).
width, // The width of the layout box.
height, // The height of the layout box.
&pTextLayout_ // The IDWriteTextLayout interface pointer.
);
}
建立對象之後,就無法變更 IDWriteTextLayout 物件中的文字。 若要變更文字,您必須刪除現有的物件,並建立新的 IDWriteTextLayout 物件。
您可以使用 IDWriteTextLayout 來格式化指定的文字範圍。 IDWriteTextLayout 也提供變更字型樣式和粗細的方法,以及新增 OpenType 字型功能和點擊測試。 如需詳細資訊和方法的完整清單,請參閱 IDWriteTextLayout 參考頁面。
格式化文字範圍
IDWriteTextLayout 提供數種方法來格式化文字範圍。 每個方法都會採用 DWRITE_TEXT_RANGE 結構做為參數,以指定字串內的起始文字位置,以及要格式化的範圍長度。 下列範例示範如何將文字範圍的字型粗細設定為粗體。
// Set the font weight to bold for the first 5 letters.
DWRITE_TEXT_RANGE textRange = {0, 5};
if (SUCCEEDED(hr))
{
hr = pTextLayout_->SetFontWeight(DWRITE_FONT_WEIGHT_BOLD, textRange);
}
轉譯選項
只有 IDWriteTextFormat 物件所描述的文字可以使用 Direct2D 來轉譯,不過,還有一些轉譯 IDWriteTextLayout 對象的選項。
您可以使用下列方法來轉譯 IDWriteTextLayout 物件所描述的字串。
- 使用 Direct2D 轉譯。
- 使用自定義文字轉譯器轉譯。
- 轉譯至 GDI 介面。