呈现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 方法调用所提供的自定义呈现器回调的方法。 DrawGlyphRun、DrawUnderlineDrawInlineObjectDrawStrikethrough 方法执行绘图函数。

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 的互操作

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 互操作