我的目标是在单个布局中绘制文字,其中包含不同大小和不透明度的特定范围。
ID2D1RenderTarget::DrawTextLayout
方法似乎是要走的路。
defaultForegroundBrush
参数的文档:
用于绘制textLayout中尚未存在的任何文本的画笔 有一个与它相关的画笔作为绘画效果(由指定 IDWriteTextLayout::SetDrawingEffect方法)。
根据IDWriteTextLayout::SetDrawingEffect
方法的备注部分,
可以将ID2D1Brush(例如颜色或渐变画笔)设置为 如果您使用ID2D1RenderTarget::DrawTextLayout绘图效果 绘制文本,刷子将用于绘制指定的范围 文本。
此绘图效果与指定范围相关联 当范围通过回调传递回应用程序 是在绘图时绘制的。
听起来ID2D1RenderTarget::DrawTextLayout
肯定会使用IDWriteTextLayout::SetDrawingEffect
设置的任何画笔。这unmanaged C++ answer似乎证实了这个想法。
但是,在实践中,DrawTextLayout
会忽略使用SolidColorBrush
设置的任何SetDrawingEffect
。我在适当的范围内获得样式和大小,但所有内容都使用默认画笔绘制。
我通过实现自定义文本渲染器(gist)来解决这个问题,这个渲染器非常简单,并根据文档准确地绘制了我对ID2D1RenderTarget::DrawTextLayout
的期望。我会感到满意,但TextRendererBase
和DrawGlyphRun
的效果比ID2D1RenderTarget::DrawTextLayout
慢25%。
可能导致此问题的原因是什么?我可以使用颜色,如文档所示,仍然使用ID2D1RenderTarget::DrawTextLayout
?
答案 0 :(得分:1)
而不是:
layout.SetDrawingEffect(myBrush, new TextRange(1, 5));
这样称呼:
layout.SetDrawingEffect(myBrush.NativePointer, new TextRange(1, 5));