DirectWrite отрисовки
Параметры отрисовки
Текст с форматированием, описанным только объектом IDWriteTextFormat , можно отрисовывать с помощью Direct2D, однако существует несколько дополнительных параметров для отрисовки объекта IDWriteTextLayout .
Строка, описанная объектом IDWriteTextLayout , может быть отрисована с помощью приведенных ниже методов.
1. Отрисовка с помощью Direct2D
Для отрисовки объекта IDWriteTextLayout с помощью Direct2D используйте метод ID2D1RenderTarget::D rawTextLayout , как показано в следующем коде.
pRT_->DrawTextLayout(
origin,
pTextLayout_,
pBlackBrush_
);
Дополнительные сведения о рисовании объекта IDWriteTextLayout с помощью Direct2D см. в разделе начало работы с DirectWrite.
2. Отрисовка с помощью пользовательского отрисовщика текста.
Отрисовка выполняется с помощью пользовательского отрисовщика с помощью метода IDWriteTextLayout::D raw , который принимает интерфейс обратного вызова, производный от IDWriteTextRenderer , в качестве аргумента, как показано в следующем коде.
// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
NULL,
pTextRenderer_, // Custom text renderer.
origin.x,
origin.y
);
Метод IDWriteTextLayout::D raw вызывает методы пользовательского обратного вызова отрисовщика, который вы предоставляете. Методы DrawGlyphRun, DrawUnderline, DrawInlineObject и DrawStrikethrough выполняют функции рисования.
IDWriteTextRenderer объявляет методы для рисования глифов выполнения, подчеркивания, зачеркиния и встроенных объектов. Реализация этих методов выполняется приложением. Создание пользовательского отрисовщика текста позволяет приложению применять дополнительные эффекты при отрисовке текста, такие как настраиваемая заливка или контур. Пример пользовательского отрисовщика текста включен в пример DirectWrite Hello World.
3. Отрисовка ClearType на поверхности GDI.
Отрисовка на поверхности GDI фактически является примером использования пользовательского отрисовщика текста. Однако некоторые из этих действий выполняются в виде интерфейса IDWriteBitmapRenderTarget .
Чтобы создать этот интерфейс, используйте метод IDWriteGdiInterop::CreateBitmapRenderTarget .
Метод DrawGlyphRun пользовательского отрисовщика текста вызывает метод IDWriteBitmapRenderTarget::D rawGlyphRun для рисования глифов. Отрисовка объектов подчеркивания, зачеркиния и встроенных объектов должна выполняться пользовательским отрисовщиком.
Интерфейс IDWriteBitmapRenderTarget отрисовывается в контексте устройства (DC) в памяти. Дескриптор этого контроллера домена можно получить с помощью метода IDWriteBitmapRenderTarget::GetMemoryDC .
memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
После выполнения рисования контроллер памяти объекта 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 см. в разделе Взаимодействие с 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
);
Связанные темы