【问题标题】:Does TextBox use GDI or GDI+TextBox 使用 GDI 还是 GDI+
【发布时间】:2014-09-23 12:49:34
【问题描述】:

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

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

那么为什么我使用 TextRenderer 而不是使用 Graphics 得到一致的结果,而它应该是其他方式呢?

【问题讨论】:

  • 您如何发布一些给出错误值的代码,并告诉我们正确的值应该是什么,为什么?
  • XY 问题?请注意, Graphics.MeasureString 有各种重载。如果你用对了它会给你很好的结果。最简单的形式是带回一个每个字符足够大的盒子,而不是用来测量字符串。查一下!

标签: c# .net textbox gdi+ gdi


【解决方案1】:

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

不过,WinForms 也封装了本机 Win32 控件,它们使用 GDI+。他们使用 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 渲染器没有实现这一点。

【讨论】:

  • 然后它说“TextBox 和 Button 都使用 GDI+ 而 RichTextBox 使用 GDI”。您不能在同一篇文章中陈述两个相反的事情并称其为“包含正确答案”,对吗?这就像,一个测试问你“陈述 X 是真的,是还是不是”,你回答“是/否”,并争辩说你提供了正确的答案。
  • 嗯,确实如此。那是错的。也许在 .NET 2.0 之前确实如此,我不记得那么久了。那就别引用了。我只是回答这个问题。
  • 是的,我想前一段时间发生了一些变化,没有正确记录或宣布,现在这种混乱发生了
  • 顺便说一句,哇,那个按钮样式很酷。为什么不默认?我的意思是,它看起来更好!但是,它似乎不显示图像...是这种按钮的限制(GDI无法绘制图像?)
  • @Istrebitel 本机 Win32 按钮控件没有对图像的内置支持。嗯,确实如此,但是您可以拥有一个带有图像的按钮一个带有文本的按钮——不能同时拥有。为了获得图像 AND 文本,您必须创建一个自绘按钮并自己绘制图像。 WinForms 的人决定将所有绘图都掌握在自己手中,这使得按钮更加可定制(例如,自定义前景色/背景色),但也使它看起来丑陋且非本地化。跨度>
【解决方案2】:

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

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

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

这基本上就是吸引我的原因。

PS:我基于这个问题UseCompatibleTextRendering property not created by designer when it is set to false接受的答案假设“默认(1)”是正确的

【讨论】:

  • 我不知道这是什么意思,即使读了几次。正如文档所说,SetCompatibleTextRenderingDefault 的默认值为 false。如果您调用该方法并将其显式设置为 false,它将为 false。如果你不调用该方法,它将是错误的。唯一正确的方法是显式调用该方法并将其设置为 true。不要那样做,保持默认即可。
  • @CodyGray 这就是我在接受的答案中看到的stackoverflow.com/questions/1296951/…。如果那是假的(默认情况下是真的)那我现在更困惑了
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-03-26
    • 1970-01-01
    • 2014-07-31
    • 2012-05-10
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多