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


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 для повышения производительности. Для этого необходимо:

  1. Очистите память контроллера домена до прозрачного.
  2. Отрисовка текста в hdc памяти с помощью сглаживания в оттенках серого (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE).
  3. Используйте функцию AlphaBlend для прозрачной отрисовки памяти HDC поверх конечного целевого HDC.
  4. Повторяйте столько раз, сколько потребуется (скажем, один раз для каждого выполнения глифа), и в промежутке между ними другие рисунки могут быть отрисованы непосредственно в конечном целевом 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  
        );

Отрисовка с помощью Direct2D

Отрисовка с использованием пользовательского средства отрисовки текста

Отрисовка на поверхности GDI

Взаимодействие с GDI