来自 WindowsClient.net:
GDI+ 将少量(1/6 em)添加到显示的每个字符串的每一端。这个 1/6 em 允许具有悬垂末端的字形(例如斜体“ f ”),并且还给 GDI+ 少量余地以帮助网格拟合扩展。
的默认操作DrawString
将在显示相邻运行时对您不利:
- 首先,默认的 StringFormat 在每个输出的每一端添加一个额外的 1/6 em;
- 其次,当网格拟合宽度小于设计时,允许字符串收缩最多一个 em。
为了避免这些问题:
- 始终传递一个基于印刷 StringFormat ( )
MeasureString
的StringFormat。
将图形设置为. 这种渲染方法使用抗锯齿和亚像素字形定位来避免网格拟合,因此本质上与分辨率无关。DrawString
GenericTypographic
TextRenderingHint
TextRenderingHintAntiAlias
在 .NET 中有两种绘制文本的方法:
- GDI+ (
graphics.MeasureString
和graphics.DrawString
)
- GDI (
TextRenderer.MeasureText
和TextRenderer.DrawText
)
来自 Michael Kaplan 的 (rip) 优秀博客Sorting It All Out,在 .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
注意: TextRenderer
是 GDI 的包装器,而graphics.DrawString
仍然是 GDI+ 的包装器。
然后是如何处理所有现有 .NET 控件的问题,例如:
他们想将它们转换为使用TextRenderer
(即 GDI),但他们必须小心。可能有些人像在 .NET 1.1 中那样依赖他们的控件绘图。于是诞生了“兼容文本渲染”。
默认情况下,应用程序中的控件的行为与 .NET 1.1 中的行为类似(它们是“兼容的”)。
您可以通过调用关闭兼容模式:
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+ 和用于 GDI 字体绘制TextRenderingHint
的相应LOGFONT
质量之间的映射也很有用:
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)
样品
以下是 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
。
也可以看看