0

我正在使用简单的代码在指定的矩形内绘制文本。一切正常,除了有时文本布局因图形比例而异(通过 Graphics.ScaleTransform 方法设置)。

很难用语言来描述这个问题,所以看一下示例图像

  1. ScaleTransform 设置为 0.3 左右 - 文本适合指定矩形内的一行。
  2. ScaleTransform 设置为 0.6 左右 - 文本在最后一个单词之前换行。

在这两种情况下,它是相同的字体、文本、布局矩形、StringFormatting 等等。唯一改变的是规模。请注意,我不使用“字体缩放”!在这两种情况下,它甚至是同一个字体对象。未设置 StringFormatFlags。

我该如何解决?我不在乎文本是否会被换行——我只需要一致性。无论规模大小,始终包裹或不包裹。怎么做?

4

1 回答 1

2

多亏了 Hans 的线索,可能的解决方案是设置Graphics.TextRenderingHintSingleBitPerPixelor SingleBitPerPixelGridFit- 它有帮助并且渲染的文本看起来总是像第一个一样。但是没有抗锯齿,文本看起来很丑(如第二个例子)。

不幸的是,这并不能解决我的问题,因为文本稍后会转换为GraphicsPath,结果总是像示例图像上显示的第二个。但是,对于该问题,还有另一种解决方案:GraphicsPath先将文本转换为,然后再绘制。

但是有一些可能的问题:

  1. 确保GraphicsPath仅在文本更改时更新,因此总体开销将最小化。
  2. 请注意,在文本更改期间开销会急剧增加 - 但这仅在您像在所见即所得应用程序中那样在用户输入期间持续显示文本时才重要。在GraphicsPath文本输入期间,必须在每次击键时重新创建。这可能是一个严重的性能瓶颈。确保您测试目标配置,因为您的里程可能会有所不同。
  3. Graphics.SmoothingMode需要设置为AntiAlias(或HighQuality 相同)以获得平滑的曲线 - 另一件事可能会影响性能。

最有趣的部分是文本转换为的解决方案GraphicsPath优于传统Graphics.DrawString方法。另请注意,字体本身是一个重要因素 - 带有花式字母的更复杂的字体使用更多的曲线点,因此它们需要更多的 CPU 时间来绘制。

在我的测试中,当字符串长到几千个字符时,我注意到明显的减速(i5 760 CPU,只有一个大的 GraphicsPath 可以绘制)

于 2012-04-11T15:39:43.723 回答