为什么DrawTextLayout会忽略SharpDX中SetDrawingEffect的画笔?

时间:2014-06-24 15:41:58

标签: c# sharpdx directwrite

我的目标是在单个布局中绘制文字,其中包含不同大小和不透明度的特定范围。 ID2D1RenderTarget::DrawTextLayout方法似乎是要走的路。

defaultForegroundBrush参数的文档:

  

用于绘制textLayout中尚未存在的任何文本的画笔   有一个与它相关的画笔作为绘画效果(由指定   IDWriteTextLayout::SetDrawingEffect方法)。

根据IDWriteTextLayout::SetDrawingEffect方法的备注部分,

  

可以将ID2D1Brush(例如颜色或渐变画笔)设置为   如果您使用ID2D1RenderTarget::DrawTextLayout绘图效果   绘制文本,刷子将用于绘制指定的范围   文本。

     

此绘图效果与指定范围相关联   当范围通过回调传递回应用程序   是在绘图时绘制的。

听起来ID2D1RenderTarget::DrawTextLayout肯定会使用IDWriteTextLayout::SetDrawingEffect设置的任何画笔。这unmanaged C++ answer似乎证实了这个想法。

但是,在实践中,DrawTextLayout会忽略使用SolidColorBrush设置的任何SetDrawingEffect。我在适当的范围内获得样式和大小,但所有内容都使用默认画笔绘制。

我通过实现自定义文本渲染器(gist)来解决这个问题,这个渲染器非常简单,并根据文档准确地绘制了我对ID2D1RenderTarget::DrawTextLayout的期望。我会感到满意,但TextRendererBaseDrawGlyphRun的效果比ID2D1RenderTarget::DrawTextLayout慢25%。

可能导致此问题的原因是什么?我可以使用颜色,如文档所示,仍然使用ID2D1RenderTarget::DrawTextLayout

1 个答案:

答案 0 :(得分:1)

而不是:

layout.SetDrawingEffect(myBrush, new TextRange(1, 5));

这样称呼:

layout.SetDrawingEffect(myBrush.NativePointer, new TextRange(1, 5));