呈现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、DrawUnderline、DrawInlineObject 和 DrawStrikethrough 方法执行绘图函数。
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 图面以提高性能。 为此,需要:
- 将内存 DC 清除为透明。
- 使用灰度抗锯齿 (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE) 将文本呈现到内存 HDC。
- 使用 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
);
相关主题