基本上,我想测量TextBox中的文本大小,我发现TextRenderer给了我正确的值,而Graphics会给我错误的值。所以看起来TextBox应该使用GDI来绘制文本,对吗?
然而,无论我在哪里阅读,我都会看到它应该使用GDI +。例如:
那么为什么我会在TextRenderer中获得一致的结果而不是图形呢?当它应该是相反的时候?
答案 0 :(得分:1)
.NET Framework在大多数地方使用GDI +。 Graphics
类是GDI +的包装。
但是,WinForms还包装本机Win32控件,不使用GDI +。他们使用GDI。 TextBox和RichTextBox就是这样的例子。他们使用GDI绘制文本。
要测量GDI +文本,您将使用Graphics.MeasureString
(请注意那里的Graphics
类)。要测量GDI文本,您将使用TextRenderer.MeasureText
(请注意Graphics
类提供的 not )。
事情变得稍微复杂一些:一些控件确实使用GDI +进行绘图。 Button控件就是一个例子。除非你将FlatStyle设置为System,否则它由.NET Framework自己绘制,并且所有者绘图是使用GDI +(.NET使用的图形子系统)完成的。但是,如果将FlatStyle设置为System,则渲染将委托给使用GDI的本机Win32 Button控件(与所有本机Win32控件一样)。
我的建议是尽可能使用GDI(TextRenderer
)来绘制文本。如果使用实现FlatStyle属性的控件,请将其设置为System。用GDI +绘制的文字相比看起来很糟糕。作为奖励,您将获得实际看起来本机并与系统融为一体的控件。 FlatStyle.System是获得实际脉冲和发光的按钮控件的唯一方法。 WinForms渲染器不实现此功能。
答案 1 :(得分:0)
好吧,还有一些研究表明,对于什么是" 默认"。
当这些消息来源谈及" 默认"时,他们会谈论" 默认(1)"如" 如果没有执行额外的代码",则不是" 默认(2)"如" 如果没有采取额外行动"。
因为" 默认(2)"," Application.SetCompatibleTextRenderingDefault(false)"被添加到新项目的Program.cs文件中,这使得TextBox类使用GDI进行渲染,而不是" 默认(1)"对于它,但实际上,如果您作为程序员不采取任何其他行动,就会发生这种情况。
这基本上就是我的目的。
PS:我的基础是"默认(1)"关于这个问题的接受答案UseCompatibleTextRendering property not created by designer when it is set to false
答案 2 :(得分:0)
GDI +错误通常出现在我们提供存储文件夹中的内容的路径并且该路径不正确时,意味着文件夹无法访问或无法找到该路径。因此,只需更正路径或允许文件夹安全性可访问。