Поделиться через


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

DirectWrite предоставляет два интерфейса форматирования текста: IDWriteTextFormat и IDWriteTextLayout. IDWriteTextFormat описывает только формат текста и используется в случаях, когда вся строка должна быть одинаковым размером шрифта, стилем, весом и т. д. С другой стороны, IDWriteTextLayout инкапсулирует как текстовую строку, так и форматирование для указанных диапазонов строки. В этом документе описывается каждый интерфейс и их использование. Дополнительные сведения о создании и методах этих интерфейсов см. на справочных страницах IDWriteTextFormat и IDWriteTextLay out.

Этот документ содержит следующие части:

IDWriteTextFormat

Объект IDWriteTextFormat используется для:

  • Описание формата для всей строки при отрисовке. Чтобы отобразить строку с несколькими форматами, используйте объект IDWriteTextLayout.
  • Укажите текстовый формат по умолчанию при создании объекта IDWriteTextLay out.

Чтобы создать объект IDWriteTextFormat, используйте метод IDWriteFactory::CreateTextFormat и укажите семейство шрифтов, коллекцию шрифтов, вес шрифта, размер шрифта (в diPs), имя языкового стандарта.

Изменение 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.