C# TextBox是否使用GDI或GDI+;

C# TextBox是否使用GDI或GDI+;,c#,.net,textbox,gdi+,gdi,C#,.net,Textbox,Gdi+,Gdi,基本上,我想测量文本框中的文本大小,我发现TextRenderer给了我正确的值,而图形会给我错误的值。看来TextBox应该使用GDI来绘制文本,对吗 然而,无论我在哪里阅读,我都看到它应该使用GDI+。例如: 这里说文本框和按钮使用GDI+ 这里它说默认的是在GDI中绘制的“兼容性模式”+ 那么,为什么我要用TextRenderer而不是图形来获得一致的结果,而实际上应该是相反的呢?大多数地方.NET Framework都使用GDI+。Graphics类是GDI+的包装器 但是,WinF

基本上,我想测量文本框中的文本大小,我发现TextRenderer给了我正确的值,而图形会给我错误的值。看来TextBox应该使用GDI来绘制文本,对吗

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

  • 这里说文本框和按钮使用GDI+
  • 这里它说默认的是在GDI中绘制的“兼容性模式”+

那么,为什么我要用TextRenderer而不是图形来获得一致的结果,而实际上应该是相反的呢?

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

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

要测量GDI+文本,您将使用
Graphics.MeasureString
(注意
Graphics
类)。要测量GDI文本,您将使用
TextRenderer.MeasureText
(请注意
图形类如何不提供它)

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


我的建议是尽可能使用GDI(
TextRenderer
)来绘制文本。如果使用实现FlatStyle特性的控件,请将其设置为System。相比之下,用GDI+绘制的文本看起来很糟糕。作为奖励,您将获得看起来像本地控件并与系统融合的控件。FlatStyle.系统是获得按钮控制的唯一方法,该按钮控制实际上是脉冲和发光的。WinForms渲染器没有实现这一点。

好吧,更多的研究表明,对什么是“默认值”存在混淆

当这些来源谈论“默认”时,他们谈论的是“如果没有执行额外的代码”中的“默认(1)”,而不是“如果没有执行额外的操作”中的“默认(2)”

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

这基本上就是我的原因


PS:我的假设是“默认(1)”是正确的,这是基于这个问题的公认答案

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

您发布一些错误值的代码,告诉我们正确值应该是什么,以及为什么?XY问题?请注意,Graphics.MeasureString具有各种重载,。如果你用对了,它会给你很好的效果。最简单的形式是返回一个每个字符足够大的框,而不是用来测量字符串。查一查!然后它说“TextBox和Button都使用GDI+,而RichTextBox使用GDI”。你不能在同一篇文章中陈述两个相反的东西,并称之为“包含正确答案”,是吗?这就像,一个测试问你“陈述X是真的,是或否”,你回答“是/否”,并争辩说你提供了正确的答案。嗯,是的,确实如此。这是错误的。也许在.NET2.0之前是真的,我不记得很久以前了。那就别提了。我会回答这个问题。是的,我想一些事情在前一段时间发生了变化,没有得到适当的记录或公布,现在这种混乱发生了。顺便说一句,哇,那个按钮样式很酷。为什么它不是默认的?我是说,看起来好多了!但是,它似乎没有显示图像。。。这是否是此类按钮的一个限制(GDI无法绘制图像?@Istrebitel本机Win32按钮控件没有内置的图像支持。是的,但是你可以有一个带图像的按钮或者一个带文本的按钮,而不是两者都有。为了获得图像和文本,您必须创建所有者绘制按钮并自己绘制图像。WinForms的人决定自己动手绘制所有的图形,这使得按钮更加可定制(例如,自定义前景/背景色),但也使它看起来丑陋和非本地。我不知道这意味着什么,即使在读了几遍之后。正如文档所说,
SetCompatibleTextRenderingDefault
的默认值为false。如果调用该方法并显式将其设置为false,则该方法将为false。如果不调用该方法,它将为false。唯一的方法是显式调用该方法并将其设置为true。不要这样做,保留默认值。@CodyGray这就是我在这里阅读的接受答案。如果这是错误的(默认情况下是正确的),那么我现在更困惑了