文字格式設定和版面配置

DirectWrite提供兩個格式化文字的介面:IDWriteTextFormatIDWriteTextLayoutIDWriteTextFormat 只會描述文字的格式,而且當整個字串是相同的字型大小、樣式、粗細等等時,就會使用。 另一方面, IDWriteTextLayout 會封裝文字字串和字串指定範圍的格式設定。 本檔描述每個介面及其用途。 如需這些介面建立和方法的詳細資訊,請參閱 IDWriteTextFormatIDWriteTextLayout 參考頁面。

本檔包含下列部分:

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物件所描述的字串可以使用下列方法來轉譯。

  1. 使用 Direct2D 轉譯
  2. 使用自訂文字轉譯器進行轉譯
  3. 轉譯至 GDI 表面