Форматирование и макет текста

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 представляет начальные сведения о форматировании. В следующем примере показано, как создать объект IDWriteTextLayout с помощью IDWriteFactory::CreateTextLayout.

// 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.