我想提一些与你的问题稍微无关的事情。你不应该使用Graphics.DrawString
不再是 GDI+ 了。它在 .NET 2 中已被弃用。相反,Microsoft 创建了TextRenderer.DrawString
.
在 .NET 中绘制文本有两种方法:
- GDI+ (
graphics.MeasureString
and graphics.DrawString
)
- GDI (
TextRenderer.MeasureText
and TextRenderer.DrawText
)
在 .NET 1.1 中使用的一切GDI+用于文本渲染。但也出现了一些问题 https://blogs.msdn.microsoft.com/cjacks/2006/05/19/gdi-vs-gdi-text-rendering-performance/:
- 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 http://msdn.microsoft.com/en-us/library/dd145037%28v=vs.85%29.aspx用于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 兼容? http://blogs.msdn.com/b/jfoscoding/archive/2005/10/13/480632.aspx
- 整理一下:快速浏览一下 Whidbey 的 TextRenderer http://www.siao2.com/2005/06/27/432986.aspx
- MSDN:LOGFONT 结构 http://msdn.microsoft.com/en-us/library/dd145037%28v=vs.85%29.aspx
- AppCompat Guy:GDI 与 GDI+ 文本渲染性能 http://blogs.msdn.com/b/cjacks/archive/2006/05/19/gdi-vs-gdi-text-rendering-performance.aspx
- GDI+ 文本、分辨率独立性和渲染方法。
或者 - 为什么我的文本在 GDI+ 和 GDI 中看起来不同? http://windowsclient.net/articles/gdiptext.aspx