文字格式設定和版面配置
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物件所描述的字串可以使用下列方法來轉譯。