2011-08-17 49 views
0

我使用简单的代码在指定的矩形内绘制文本。一切工作正常,除了有时文本布局根据图形比例(通过Graphics.ScaleTransform方法设置)不同。更改图形比例时.NET DrawString()不同的文本布局

很难用语言描述的问题,所以来看看例子image

  1. ScaleTransform设置为东西0.3左右 - 文本中指定的矩形区域内的一个线相符。
  2. ScaleTransform设置为0.6左右 - 文本被包裹在最后一个单词之前。

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

我该如何解决这个问题?我不在乎文本是否被包装 - 我只需要一致性。无论规模如何,总是包装或不包装。怎么做?

+0

它不会呈现同样的我已经注意到明显放缓。第一行用TextRenderingHint.ClearTypeGridFit呈现,第二行用TextRenderingHint.AntiAlias呈现。使用像SysInternal的ZoomIt这样的工具来查看。 TrueType提示使这件事变得困难,它延伸字母以使茎与像素网格重合。关掉它使它变得丑陋。为此留出一些空间。 –

+0

Hans,在这两种情况下TextRenderingHint都设置为SystemDefault。改变它为例如AntiAlias没有帮助 - 差异仍然存在(虽然文字看起来好多了)。 – SiliconMind

+0

但是,似乎将TextRenderingHint更改为SingleBitPerPixel或SingleBitPerPixelPixelGridFit有所帮助 - 文本从不包装(但看起来很丑陋)。不幸的是,这并不能解决问题,因为如果我向GraphicsPath添加文本(最终我在应用程序中做了什么),则无法模拟SingleBitPerPixelGridFit设置。 – SiliconMind

回答

2

感谢来自Hans的线索,可能的解决方案是将Graphics.TextRenderingHint设置为SingleBitPerPixelSingleBitPerPixelGridFit - 它的帮助和呈现的文字看起来总是像第一个。但是没有抗锯齿和文本看起来很丑陋(就像第二个例子)。

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

但也有一些可能出现的问题:

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

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

在我的测试中,当丝线不再是那个几千个字符(酷睿i5 760 CPU,只有一个大的GraphicsPath画)