呈现DirectWrite

呈现选项

只有 IDWriteTextFormat 对象描述具有格式的文本可以使用 Direct2D 呈现,但是,还有几个用于呈现 IDWriteTextLayout 对象的选项。

IDWriteTextLayout 对象描述的字符串可以使用以下方法呈现。

1. 使用 Direct2D 呈现

若要使用 Direct2D 呈现 IDWriteTextLayout 对象,请使用 ID2D1RenderTarget::D rawTextLayout 方法,如以下代码所示。

pRT_->DrawTextLayout(
    origin,
    pTextLayout_,
    pBlackBrush_
    );

有关使用 Direct2D 绘制 IDWriteTextLayout 对象的更深入的了解,请参阅使用 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 方法调用所提供的自定义呈现器回调的方法。 DrawGlyphRunDrawUnderlineDrawInlineObjectDrawStrikethrough 方法执行绘图函数。

IDWriteTextRenderer 声明用于绘制字形运行、下划线、删除线和内联对象的方法。 由应用程序来实现这些方法。 创建自定义文本呈现器允许应用程序在呈现文本时应用其他效果,例如自定义填充或轮廓。 示例自定义文本呈现器包含在DirectWrite Hello World示例中

3. 将 ClearType 呈现到 GDI 图面。

呈现到 GDI 图面实际上是使用自定义文本呈现器的示例。 但是,某些工作是以 IDWriteBitmapRenderTarget 接口的形式为你完成的。

若要创建此接口,请使用 IDWriteGdiInterop::CreateBitmapRenderTarget 方法。

自定义文本呈现器的 DrawGlyphRun 方法调用 IDWriteBitmapRenderTarget::D rawGlyphRun 方法来绘制字形。 下划线、删除线和内联对象的呈现必须由自定义呈现器完成。

IDWriteBitmapRenderTarget 接口呈现到内存中 DC) (设备上下文。 使用 IDWriteBitmapRenderTarget::GetMemoryDC 方法获取此 DC 的句柄。

memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();

执行绘图后,必须将 IDWriteBitmapRenderTarget 对象的内存 DC 复制到目标 GDI 图面。

注意

还可以选择将位图传输到另一种类型的图面,例如 GDI+ 图面。

 

// Transfer from DWrite's rendering target to the window.
BitBlt(
    hdc,
    0, 0,
    size.cx, size.cy,
    memoryHdc,
    0, 0, 
    SRCCOPY | NOMIRRORBITMAP
    );

注意

你的应用负责在最后将所有内容呈现到窗口。 这包括文本和图形。 这会产生性能损失。 此外,呈现到内存 DC 不是 GDI 硬件加速的。

 

有关与 GDI 互操作的更详细概述,请参阅 与 GDI 互操作

4. 以透明方式将灰度文本呈现到 GDI 图面。 (Windows 8 及更高版本的)

从Windows 8开始,可以透明地将灰度文本呈现到 GDI 图面以提高性能。 为此,需要:

  1. 将内存 DC 清除为透明。
  2. 使用灰度抗锯齿 (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE) 将文本呈现到内存 HDC。
  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 互操作