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


Отрисовка 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 для повышения производительности. Для этого необходимо выполнить следующие действия.

  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