基本上,我想测量TextBox中的文本大小,我发现TextRenderer给了我正确的值,而Graphics会给出错误的值。因此,似乎TextBox应该使用GDI来绘制文本,对吗?
然而,无论我读到什么地方,我都看到它应该使用GDI+。例如:
那么,为什么我得到的结果与TextRenderer一致,而不是图形,而应该是相反的呢?
发布于 2014-07-31 14:26:30
好吧,一些更多的研究表明,什么是“违约”是一种混淆。
当这些源讨论“默认”时,他们谈论“默认(1)”,如“如果没有执行额外的代码”,而不是“缺省(2)”,如“如果没有采取额外的行动”。
因为在"Default(2)“中,"Application.SetCompatibleTextRenderingDefault(false)”被添加到一个新项目的Program.cs文件中,这使得TextBox类使用GDI来进行呈现,这不是它的“默认(1)”,但是实际上,如果您作为一个程序员不采取任何额外的操作,就会发生这种情况。
这基本上就是我想要的。
PS:我的假设是“默认(1)”是正确的,这是基于这个问题UseCompatibleTextRendering property not created by designer when it is set to false的公认答案
发布于 2014-07-31 14:26:01
.NET框架在大多数地方都使用GDI+。Graphics类是GDI+的包装器。
但是,WinForms也封装了不使用GDI+的本机Win32控件。他们用GDI。TextBox和RichTextBox就是这方面的例子。他们使用GDI绘制他们的文本。
要度量GDI+文本,您将使用Graphics.MeasureString (注意那里的Graphics类)。要度量GDI文本,您将使用TextRenderer.MeasureText (注意Graphics类如何不提供它)。
事情确实变得更复杂了:有些控件确实使用GDI+进行绘图。Button控件就是一个例子。除非您将其FlatStyle设置为System,否则它是由.NET框架绘制的,并且所有者绘图是使用GDI+ (.NET使用的图形子系统)完成的。但是,如果将FlatStyle设置为System,则呈现将委托给本机Win32 Button控件,该控件使用GDI (与所有本机Win32控件一样)。
我的建议是尽可能使用GDI (TextRenderer)来绘制文本。如果使用实现FlatStyle属性的控件,请将其设置为System。相比之下,用GDI+绘制的文本看起来糟透了。作为一种奖励,您将获得真正看起来本地的控件,并与系统相融合。FlatStyle.System是获得按钮控制的唯一方法,它实际上是脉冲和发光。WinForms呈现器没有实现这一点。
发布于 2018-04-20 15:33:13
当我们给出存储文件夹中某物的路径时,通常会出现GDI+错误,而该路径不正确,这意味着文件夹无法访问或无法找到该路径。因此,只需更正路径或允许文件夹安全访问即可。
https://stackoverflow.com/questions/25061209
复制相似问题