基本上,我想测量 TextBox 中的文本大小,我发现 TextRenderer 给出了正确的值,而 Graphics 给出了错误的值。那么看起来 TextBox 应该使用 GDI 来绘制文本,对吗?
但是,无论我在哪里阅读,我都发现它应该使用 GDI+。例如:
- 这里http://microsoft.public.dotnet.framework.windowsforms.controls.narkive.com/yoHKjPut/text-rendering-accuracy-problem-in-textbox-richtextbox它说文本框和按钮使用 GDI+。
- 这里Why is Graphics.MeasureString() returning a higher than expected number?它说默认是在 GDI+ 中绘制的“兼容模式”
那么,为什么我使用 TextRenderer 得到了一致的结果,而不是使用 Graphics 得到的结果,而实际上应该是相反的结果呢?
最佳答案
.NET Framework 在大多数地方都使用 GDI+。 Graphics
类是 GDI+ 的包装器。
但是,WinForms 还包装了 native Win32 控件,这些控件不使用 GDI+。他们使用GDI。 TextBox 和 RichTextBox 就是这样的示例。他们使用 GDI 绘制文本。
要测量 GDI+ 文本,您将使用 Graphics.MeasureString
(请注意其中的 Graphics
类)。要测量 GDI 文本,您将使用 TextRenderer.MeasureText
(请注意它是如何Graphics
类提供的)。
事情确实变得稍微复杂一些:一些控件确实使用 GDI+ 进行绘图。 Button 控件就是一个例子。除非将其 FlatStyle 设置为 System,否则它由 .NET Framework 进行所有者绘制,并且该所有者绘制是使用 GDI+(.NET 使用的图形子系统)完成的。但是,如果将 FlatStyle 设置为 System,则渲染将委托(delegate)给 native Win32 Button 控件,该控件使用 GDI(与所有 native Win32 控件一样)。
我的建议是尽可能使用 GDI (TextRenderer
) 来绘制文本。如果您使用实现 FlatStyle 属性的控件,请将其设置为 System。相比之下,用 GDI+ 绘制的文本看起来就很糟糕。作为奖励,您将获得看起来真正原生并与系统融为一体的控件。 FlatStyle.System 是获得实际脉冲和发光的按钮控件的唯一方法。 WinForms 渲染器没有实现这一点。
关于c# - TextBox使用GDI还是GDI+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25061209/