TextRenderer.DrawText在XP vs Vista上呈现不同的Arial

时间:2010-04-08 06:25:26

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

我有一个用于文本渲染的c#应用程序,与简单的所见即所得文本编辑器相同。

我正在使用TextRenderer.DrawText将文本渲染到屏幕,使用GetTextExtentPoint32来测量文本,这样我就可以在同一行上定位不同的字体样式/大小。

在Vista中,一切正常。然而,在XP中,Arial渲染方式不同,某些字符(如“o”和“b”)占用的宽度比Vista中的宽。 GetTextExtentPoint32似乎是在Vista中测量字符串,但宽度较小。最终的结果是,每隔一段时间就会出现一段文本与之前的文本重叠,因为前面的文本被测量为小于它实际在屏幕上的文本。

另外,我的文本渲染代码模仿ie的文本渲染(仅适用于简单的格式和英文),即文本渲染在vista和xp之间似乎是一致的 - 这就是我注意到不同字符大小的变化。 / p>

任何人对于发生了什么都有任何想法?

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

注意:遗憾的是TextRenderer.MeasureString不够快或不够准确,无法满足我的要求。我尝试使用它并且不得不把它撕掉。

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

我不是C#家伙,但我相信.NET渲染是建立在GDI +之上的。我也非常确定GDI +会使用自己的字体渲染来使用不带颜色的缩放。

另一方面,

GetTextExtentPoint32是GDI的一部分。 GDI使用大小调整提示,这可能会影响字符的宽度,具体取决于字体大小。一般来说,小尺寸的GDI文本看起来有点吸气,但它不会线性扩展。

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

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

另见my answer on print preview

答案 2 :(得分:0)

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

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