来自 WindowsClient.net:
GDI+ 在显示的每个字符串的每一端添加少量 (1/6 em)。此 1/6 em 允许具有悬垂末端的字形(例如斜体 'f'),并且还为 GDI+ 提供了少量的余地来帮助网格拟合扩展。
默认动作为DrawString
在显示相邻运行时会对您不利:
- 首先,默认的 StringFormat 在每个输出的每一端添加额外的 1/6 em;
- 其次,当网格安装宽度小于设计宽度时,允许绳子收缩最多一个em。
为了避免这些问题:
- 总是通过
MeasureString
and DrawString
基于印刷字符串格式的 StringFormat (StringFormat.GenericTypographic
).
设置图形TextRenderingHint
to TextRenderingHintAntiAlias
。这种渲染方法使用抗锯齿和子像素字形定位来避免网格拟合的需要,因此本质上与分辨率无关。
在 .NET 中绘制文本有两种方法:
- GDI+ (
graphics.MeasureString
and graphics.DrawString
)
- GDI (
TextRenderer.MeasureText
and TextRenderer.DrawText
)
来自 Michael Kaplan 的(翻录)优秀博客全部整理出来, 在 .NET 1.1 中使用的一切GDI+用于文本渲染。但也存在一些问题:
- GDI+ 的无状态特性会导致一些性能问题,其中设备上下文将被设置,然后在每次调用后恢复原始状态。
- Windows/Uniscribe 和 Avalon (Windows Presentation Foundation) 的国际文本整形引擎已更新多次,但尚未更新 GDI+,这导致对新语言的国际渲染支持不具有相同的质量水平。
所以他们知道他们想要更改 .NET 框架以停止使用GDI+的文本渲染系统,并使用GDI。起初他们希望能够简单地改变:
graphics.DrawString
打电话给旧的DrawText
API 而不是 GDI+。但他们无法使文本换行和间距与 GDI+ 完全匹配。所以他们被迫保留graphics.DrawString
调用 GDI+(兼容性原因;调用的人graphics.DrawString
会突然发现他们的文本没有像以前那样换行)。
一个新的静态TextRenderer
创建类是为了包装 GDI 文本渲染。它有两种方法:
TextRenderer.MeasureText
TextRenderer.DrawText
Note: TextRenderer
是 GDI 的包装,而graphics.DrawString
仍然是 GDI+ 的包装。
然后是如何处理所有现有 .NET 控件的问题,例如:
他们想把它们转过来使用TextRenderer
(即 GDI),但他们必须小心。可能有人像在 .NET 1.1 中那样依赖控件绘制。于是就诞生了“兼容的文本渲染".
默认情况下,应用程序中的控件的行为就像在 .NET 1.1 中一样(它们是“兼容的").
You turn off兼容模式通过调用:
Application.SetCompatibleTextRenderingDefault(false);
这使您的申请更好、更快,并获得更好的国际支持。总结:
SetCompatibleTextRenderingDefault(true) SetCompatibleTextRenderingDefault(false)
======================================= ========================================
default opt-in
bad good
the one we don't want to use the one we want to use
uses GDI+ for text rendering uses GDI for text rendering
graphics.MeasureString TextRenderer.MeasureText
graphics.DrawString TextRenderer.DrawText
Behaves same as 1.1 Behaves *similar* to 1.1
Looks better
Localizes better
Faster
注意 GDI+ 之间的映射也很有用TextRenderingHint
以及相应的LOGFONT Quality用于GDI字体绘制:
TextRenderingHint mapped by TextRenderer to LOGFONT quality
======================== =========================================================
ClearTypeGridFit CLEARTYPE_QUALITY (5) (Windows XP: CLEARTYPE_NATURAL (6))
AntiAliasGridFit ANTIALIASED_QUALITY (4)
AntiAlias ANTIALIASED_QUALITY (4)
SingleBitPerPixelGridFit PROOF_QUALITY (2)
SingleBitPerPixel DRAFT_QUALITY (1)
else (e.g.SystemDefault) DEFAULT_QUALITY (0)
Samples
以下是 GDI+ (graphics.DrawString) 与 GDI (TextRenderer.DrawText) 文本渲染的一些比较:
GDI+: TextRenderingHintClearTypeGridFit
, GDI: CLEARTYPE_QUALITY
:
GDI+: TextRenderingHintAntiAlias
, GDI: ANTIALIASED_QUALITY
:
GDI+: TextRenderingHintAntiAliasGridFit
, GDI: 不支持,使用ANTIALIASED_QUALITY:
GDI+: TextRenderingHintSingleBitPerPixelGridFit
, GDI: PROOF_QUALITY
:
GDI+: TextRenderingHintSingleBitPerPixel
, GDI: DRAFT_QUALITY
:
我觉得奇怪的是DRAFT_QUALITY
与PROOF_QUALITY
,这与CLEARTYPE_QUALITY
.
See also
- UseCompatibleTextRendering - 与 whaaaaaat 兼容?
- 整理一下:快速浏览一下 Whidbey 的 TextRenderer
- MSDN:LOGFONT 结构
- AppCompat Guy:GDI 与 GDI+ 文本渲染性能
- GDI+ 文本、分辨率独立性和渲染方法。
或者 - 为什么我的文本在 GDI+ 和 GDI 中看起来不同?