Отрисовка DirectWrite
Параметры отрисовки
Текст с форматированием, описанным только объектом IDWriteTextFormat, можно отобразить с помощью Direct2D, однако есть несколько дополнительных вариантов для отрисовки объекта IDWriteTextLayout.
Строка, описанная объектом IDWriteTextLayout, может отображаться с помощью приведенных ниже методов.
1. Отрисовка с помощью Direct2D
Чтобы отобразить объект IDWriteTextLayout с помощью Direct2D, используйте метод ID2D1RenderTarget::DrawTextLayout, как в приведенном ниже коде.
pRT_->DrawTextLayout(
origin,
pTextLayout_,
pBlackBrush_
);
Дополнительные сведения о рисовании объекта IDWriteTextLayout с помощью Direct2Dсм. в статье Начало работы с DirectWrite.
2. Отрисовка с помощью пользовательского отрисовщика текста.
При отрисовке с использованием пользовательского отрисовщика применяется метод IDWriteTextLayout::Draw, который принимает интерфейс обратного вызова, производный от IDWriteTextRenderer в качестве аргумента, как показано в следующем примере кода.
// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
NULL,
pTextRenderer_, // Custom text renderer.
origin.x,
origin.y
);
Метод IDWriteTextLayout::Draw вызывает методы предоставленного обратного вызова пользовательского отрисовщика. Методы DrawGlyphRun, DrawUnderline, DrawInlineObjectи DrawStrikethrough выполняют функции рисования.
IDWriteTextRenderer объявляет методы для рисования следа глифов, подчеркивания, зачёркивания и встроенных объектов. Приложение предназначено для реализации этих методов. Создание пользовательского отрисовщика текста позволяет приложению применять дополнительные эффекты при отрисовке текста, например настраиваемую заливку или контур. Пример пользовательского отрисовщика текста включен в пример DirectWrite Hello World.
3. Отобразить ClearType на поверхности GDI.
Визуализация на поверхности GDI фактически является примером использования пользовательского отрисовщика текста. Однако некоторые действия выполняются для вас в виде интерфейса IDWriteBitmapRenderTarget.
Чтобы создать этот интерфейс, используйте метод IDWriteGdiInterop::CreateBitmapRenderTarget.
Метод DrawGlyphRun пользовательского отрисовщика текста вызывает метод IDWriteBitmapRenderTarget::DrawGlyphRun для рисования глифов. Отрисовка подчеркивания, зачеркивания и встроенных объектов должна выполняться вашим пользовательским отрисовщиком.
Интерфейс IDWriteBitmapRenderTarget отображается в контексте устройства (DC) в памяти. Вы получите дескриптор этого контроллера домена с помощью метода IDWriteBitmapRenderTarget::GetMemoryDC.
memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
После выполнения отрисовки контроллер памяти DC объекта IDWriteBitmapRenderTarget должен быть скопирован на целевую поверхность GDI.
Заметка
Вы также можете передать растровое изображение другому типу поверхности, например поверхности GDI+.
// Transfer from DWrite's rendering target to the window.
BitBlt(
hdc,
0, 0,
size.cx, size.cy,
memoryHdc,
0, 0,
SRCCOPY | NOMIRRORBITMAP
);
Заметка
Ваше приложение несет ответственность за отрисовку всего в окне в итоге. Это включает текст и графику. Это приводит к снижению производительности. Кроме того, отрисовка в память контроллера домена не является аппаратным ускорением GDI.
Более подробную информацию о взаимодействии с GDI см. в Interoperating with GDI.
4. Отрисовка текста в градациях серого на поверхность GDI с прозрачностью. (Windows 8 и более поздние версии)
Начиная с Windows 8, вы можете прозрачно отображать серый текст на поверхности GDI для повышения производительности. Для этого необходимо выполнить следующие действия.
- Очистите контекст памяти до прозрачности.
- Отрисовка текста в HDC с использованием сглаживания по шкале серого (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE).
- Используйте функцию AlphaBlend для прозрачной отрисовки памяти HDC поверх конечного целевого HDC.
- Повторяйте столько раз, сколько нужно (например, один раз на каждый глиф), и другие графические объекты могут быть отрисованы напрямую на конечный целевой HDC, не заменяясь функцией AlphaBlend.
pRT_->SetTextAntialiasMode(DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE);
pRT_->DrawTextLayout(
origin,
pTextLayout_,
pBlackBrush_
);
BLENDFUNCTION blendFunction = { 0 };
blendFunction.BlendOp = AC_SRC_OVER;
blendFunction.SourceConstantAlpha = 255;
blendFunction.AlphaFormat = AC_SRC_ALPHA;
AlphaBlend(
hdc,
0, 0,
width, height,
pRT_->GetMemoryDC(),
0, 0,
width, height,
blendFunction
);
Связанные разделы