【问题标题】:TextRenderer.DrawText renders Arial differently on XP vs VistaTextRenderer.DrawText 在 XP 和 Vista 上以不同方式呈现 Arial
【发布时间】:2011-02-05 13:54:20
【问题描述】:

我有一个 c# 应用程序,它可以进行文本渲染,与简单的所见即所得文本编辑器相当。

我正在使用 TextRenderer.DrawText 将文本呈现到屏幕上,并使用 GetTextExtentPoint32 来测量文本,以便我可以在同一行上放置不同的字体样式/大小。

在 Vista 中,这一切正常。然而,在 XP 中,Arial 的呈现方式有所不同,某些字符(如 'o' 和 'b')比 Vista 中占用更多的宽度。 GetTextExtentPoint32 似乎像在 Vista 中一样测量字符串,但宽度更小。最终结果是,由于前面的文本被测量为小于屏幕上的实际大小,因此一段文本会时不时地与前面的文本重叠。

另外,我的文本渲染代码完全模仿了 ie 的文本渲染(仅适用于简单格式和英语),并且 vista 和 xp 之间的 ie 文本渲染似乎是一致的——这就是我注意到不同字符大小变化的原因。

有人对正在发生的事情有任何想法吗?

简而言之,TextRenderer.DrawText 和 GetTextExtentPoint32 在 xp 中与 Arial 不匹配。 DrawText 似乎绘制的某些字符比它在 Vista 中更大和/或更小,但 GetTextExtentPoint32 似乎像在 Vista 中一样测量文本(这似乎与 xp 和 vista 上的 ie 中的文本呈现相匹配)。希望这是有道理的。

注意:不幸的是,TextRenderer.MeasureString 不够快或不够准确,无法满足我的要求。我试过用它,不得不把它撕掉。

【问题讨论】:

  • +1 因为我知道你在处理什么!我只需要处理固定宽度的字体。
  • 您确定这不是 DPI 或 Cleartype 类型的问题吗?

标签: c# text windows-vista windows-xp textrenderer


【解决方案1】:

感谢您抽出宝贵时间回复阿德里安。

我的理解是 TextRenderer.DrawText 实际上包装了对 GDI 的调用,完全绕过了 GDI+ 文本渲染。这就是为什么我对 GetTextExtentPoint32 与输出不一致感到困惑的原因。

我想我发现了这个问题。事实证明,如果将 Graphics.TextRenderingHint 设置为 System.Drawing.Text.TextRenderingHint.ClearTypeGridFit 或其他值,它会导致某些字体中的某些字符大小增加或减小。这在 XP 中似乎比在 Vista 中更真实。我还没有看到它在Vista中发生。无论如何,看起来 GetTextExtentPoint32 要么无法识别差异,要么我在拨打电话时没有设置某种标志。

我的解决方案是只使用系统默认的 textrenderinghint 设置。

【讨论】:

【解决方案2】:

实际上TextRenderer 的DrawText 和MeasureString 都是基于DrawTextEx(这是User32,不是Gdi 函数)。 所以你可以考虑使用本机编组调用这个函数而不是 MeauseString,因为它会做一些额外的计算(特别是如果你使用没有 HDC 的函数覆盖)。

也许这个post 也会对你有所帮助。

【讨论】:

    【解决方案3】:

    我不是 C# 专家,但我相信 .NET 渲染是建立在 GDI+ 之上的。我也很确定 GDI+ 会使用无提示缩放进行自己的字体渲染。

    另一方面,GetTextExtentPoint32 是 GDI 的一部分。 GDI 使用大小提示,它会根据字体大小影响字符的宽度。一般来说,小尺寸的 GDI 文本看起来会有点吸睛,但不会线性缩放。

    您必须始终如一地使用一种或另一种模型才能获得像素完美的结果。

    可能还有其他因素在起作用,这在 XP 上比在 Vista 上更明显,但两者都存在根本问题。这些其他因素可能包括 DPI 设置、DPI 缩放、ClearType 或抗锯齿设置、字体链接(如果您正在混合来自其他字母的脚本)、字体替换(尤其是在打印中),甚至可能是不同版本的 Arial。我什至不确定 GDI+ 是否使用与 GDI 相同的默认映射模式。

    另见my answer on print preview

    【讨论】:

      猜你喜欢
      • 2011-05-16
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      相关资源
      最近更新 更多