Форматирование и макет текста
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 , может быть отрисована с помощью приведенных ниже методов.
- Отрисовка с помощью Direct2D.
- Отрисовка с помощью пользовательского отрисовщика текста.
- Отрисовка в поверхности GDI.