文本格式和布局

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