TextBox是使用GDI还是GDI +

基本上,我想测量TextBox中的文本大小,我发现TextRenderer给了我正确的值,而Graphics会给我错误的值。 所以看起来TextBox应该使用GDI来绘制文本,对吧?

但是,无论我在哪里阅读,我都会看到它应该使用GDI +。 例如:

  • 这里http://microsoft.public.dotnet.framework.windowsforms.controls.narkive.com/yoHKjPut/text-rendering-accuracy-problem-in-textbox-richtextbox它说TextBox和Buttons使用GDI +。
  • 这里为什么Graphics.MeasureString()返回高于预期的数字? 它说默认是“兼容模式”,它吸引了GDI +

那么为什么我在使用TextRenderer时会得到一致的结果而不是图形呢?当它应该是另外一种方式时?

.NET Framework在大多数地方使用GDI +。 Graphics类是GDI +的包装器。

但是,WinForms还包装了使用GDI +的本机Win32控件。 他们使用GDI。 TextBox和RichTextBox就是这样的例子。 他们使用GDI绘制文本。

要测量GDI +文本,您将使用Graphics.MeasureString (请注意那里的Graphics类)。 要测量GDI文本,您将使用TextRenderer.MeasureText (请注意Graphics提供它的方式)。

事情变得稍微复杂一些一些控件确实使用GDI +进行绘图。 Button控件就是一个例子。 除非您将其FlatStyle设置为System,否则它由.NET Framework自行绘制,并且所有者绘图是使用GDI +(.NET使用的图形子系统)完成的。 但是,如果将FlatStyle设置为System,则渲染将委托给使用GDI的本机Win32 Button控件(与所有本机Win32控件一样)。

我的建议是尽可能使用GDI( TextRenderer )来绘制文本。 如果使用实现FlatStyle属性的控件,请将其设置为System。 用GDI +绘制的文字相比看起来很糟糕。 作为奖励,您将获得实际看起来本机并与系统融为一体的控件。 FlatStyle.System是获得实际脉冲和发光的按钮控件的唯一方法。 WinForms渲染器不实现此function。

好吧,一些更多的研究表明存在“ 默认 ”的混淆。

当这些消息来源谈论“ 默认 ”时,他们会谈论“ 默认(1) ”,如“ 如果没有执行额外代码 ”,而不是“ 默认(2) ”,如“ 如果不采取额外行动 ”。

因为通过“ Default(2) ”,“Application.SetCompatibleTextRenderingDefault(false)”被添加到新项目的Program.cs文件中,这使得TextBox类使用GDI进行渲染,这不是“ Default(1) ”它,但事实上,如果你作为一个程序员,不采取任何额外的行动会发生这种情况。

这基本上是什么让我。

PS:我的基础是,默认情况下,“Default(1)”对此问题的接受答案是正确的UseCompatibleTextRendering属性,当设置为false时不是由设计者创建的

GDI +错误通常出现在我们提供存储文件夹中的内容的路径并且该路径不正确时,意味着文件夹无法访问或无法找到该路径。 因此,只需更正路径或允许文件夹安全性可访问。