c# - TextBox使用GDI还是GDI+

标签 c# .net textbox gdi+ gdi

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

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

那么,为什么我使用 TextRenderer 得到了一致的结果,而不是使用 Graphics 得到的结果,而实际上应该是相反的结果呢?

最佳答案

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

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

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

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

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

关于c# - TextBox使用GDI还是GDI+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25061209/

相关文章:

c# - NAudio 将样本缓冲区转换为波形缓冲区

c# - UWP AutoSuggestBox QueryIcon 在添加样式后消失

c# - 线程执行顺序

c# - 多平台支持的 WCF Restful 服务文件上传

swift - 保存从文本字段输入的文本以在其他文件中使用它 [Swift]

用于渲染 PDF 和 OCR 生成图像的 C# 解决方案?

c# - 如何编写 switch 语句来测试 DialogResult 并提供 fall through 逻辑

c# - IEnumerable 和延迟加载

c++ winsock客户端无法使用主机IP的文本框进行连接

javascript - 启用具有不同元素的复选框