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

Mic*_*ael 6 c# text windows-xp windows-vista textrenderer

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

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

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

此外,我的文本渲染代码模仿即正确的文本渲染(仅用于简单格式和英文),即文本渲染似乎在vista和xp之间保持一致 - 这就是我注意到不同字符大小的变化.

有什么想法发生了什么?

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

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

Adr*_*thy 0

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

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

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

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

另请参阅我对打印预览的回答