使用 Graphics.DrawString 模拟 TextBox 渲染

2024-01-27

我有一个承载 TextBox 的 C# UserControl。

当自定义控件被禁用时,我希望将 TextBox 呈现为“禁用+只读”(即不灰显)。因此,当自定义控件捕获 EnabledChanged 时,它会相应地设置托管的 TextBox 属性。

但是,UserControl 的启用状态优先于其他所有状态,并且 TextBox 仍然呈灰色显示(即使其内部前景色是正确的)。

因此,我决定在禁用自定义控件时隐藏托管的 TextBox 并自己绘制它。我可以使用各种 ControlPaint.DrawXxx 函数成功渲染 TextBox 边框。

但是,与本机渲染相比,绘制文本会导致输出拉伸。也就是说,文本从完全相同的像素位置开始,但字符间距明显更大。

我使用文本框自己的字体来执行渲染,所以我不知道我做错了什么。我能提出的唯一理由是 C# TextBox 是由 Windows 直接呈现的(使用 ExtTextOut Win32 API),这导致了明显的差异。

我可以使用哪些选项来模拟本机 TextBox 渲染?


不同之处在于Graphics.DrawString http://msdn.microsoft.com/en-us/library/system.drawing.graphics.drawstring.aspx uses GDI+呈现文本,而 Win32 API 使用GDI内部用于一切,包括在控件上绘制文本。

自 .NET 2.0 起 http://msdn.microsoft.com/en-us/magazine/cc751527.aspx,您可以使用以下命令轻松模仿其外观TextRenderer.DrawText method http://msdn.microsoft.com/en-us/library/4eab953f.aspx,同样使用GDI来绘制。

大多数情况下,更换Graphics.DrawString with TextRenderer.DrawText很简单。您没有显示任何代码,因此很难给出具体的示例。


至于为什么必须首先执行此操作...禁用容器控件始终会禁用其所有子控件。这在 Windows 中是一条硬性规则,没有例外。当然,这是一个非常明智的做法。
如果您不希望禁用容器内的所有控件,则不应禁用整个容器 - 只需禁用该容器内的各个控件即可。

即使使用稍微更好的渲染文本的方法,我仍然强烈建议您not尝试并重新实施TextBox控制。这是一项相当复杂的工作,您不太可能仅通过几天/几周的努力就可以完成它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Graphics.DrawString 模拟 TextBox 渲染 的相关文章

  • 从 C# 检测 powerpoint 形状上的事件

    是否有可能检测在 Powerpoint 形状 例如箭头 上发生的事件 到目前为止 我发现唯一的可能性是 selectitemchanged beforerightclick 和 beforedoubleclick 但无法找到检测其他内容的方
  • 如何在不发送电子邮件的情况下检查 smtp 服务器? [复制]

    这个问题在这里已经有答案了 我有一个 Web 应用程序 用户可以设置 SMTP 服务器信息 服务器 主机 SMTP 端口 用户名 密码 电子邮件地址 使用的 SSL 当用户设置信息时我需要验证服务器而不发送电子邮件并检查smtp信息是否有效
  • 为什么自定义类型变量不保存值MVC

    我正在尝试使用 MVC 5 构建一个网站 我有一个包含 3 个变量的控制器类 public class WorkerController Controller public ViewModel viewModel new ViewModel
  • 在调试模式下单步执行时跳过方法的属性

    是否有一个属性可以在方法上使用 以便在调试模式下单步执行某些代码时 调试器保持在方法的外部 DebuggerStepThrough docs https learn microsoft com en us dotnet api system
  • Spring.NET 和构造函数拦截器

    我正在尝试在构造时对对象进行一些 AOP 并找到了 IConstructorInterceptor 这对于我想要的东西来说是完美的 但它似乎不起作用 http jira springframework org browse SPRNET 2
  • IL 的仿制药?

    是否可以在 IL 生成器中使用泛型 DynamicMethod method new DynamicMethod GetStuff typeof int new Type typeof object ILGenerator il metho
  • 正则表达式不等于字符串

    我用正则表达式用头撞墙 我正在尝试定义一个表达式 该表达式完全排除此文本 System 不区分大小写 但可以包含 系统 这个词提供的不仅仅是这个 例子 系统 无效 系统 无效 系统 无效 系统 无效 asd 系统 有效 asd 系统 asd
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • TreeView:仅在子节点中存在复选框

    我需要一个树视图控件 根节点没有复选框 只有图像 所有子节点都有一个复选框 图像 C net 2 0 winforms 不是 wpf WinForms树视图默认不支持混合复选框 非复选框节点 您可以在树视图上全局启用复选框 并使用以下命令在
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所
  • EasyNetQ 模型关闭

    我使用 EasyNetQ 实现了一个简单的 RabbitMQ 客户端 连接后 我收到一条通知 队列模型关闭 这是我的代码 var bus RabbitHutch CreateBus String Format host 0 hostName
  • Java制作一条有向线并使其移动

    我想画一条有向线并让它移动 我能够绘制一条有向线并移动该线 但当我移动该线时箭头会移位 这是我的绘画方法 Line2D Double line new Line2D Double startX startY endX endY g2d dr
  • Sitecore - 隐藏功能区中的按钮

    我为特定内容项创建了上下文功能区 我有两个按钮 可以将项目 升级 或 降级 到某一类别 该部分只能有一个 是否可以根据某种隐藏代码中的内容状态隐藏其中一个按钮 我了解如何链接到 Click 事件 但我想知道是否有某种加载事件可供自定义功能区
  • 在 .Net 托管的 IronPython 脚本中设置和获取变量

    我正在尝试使用 Net 控制台应用程序中托管的 IronPython 来构建验证规则引擎的原型 我已经将脚本精简到我认为的基础内容 var engine Python CreateEngine engine Execute from Sys
  • 如何在非托管 ATL GUI 中嵌入 Windows 窗体?

    我有一个使 COM 可见的 Windows 窗体用户控件 现在我想将该控件嵌入到 ATL 对话框 GUI 中 ATL项目 非托管C 只应获取winform的progID并在运行时动态创建和嵌入它 这可能吗 如果可以 我该怎么做 我不确定 A
  • 调整图像的亮度、对比度和伽玛值

    在 NET 中调整图像的亮度 对比度和伽玛值的简单方法是什么 c and gdi have a simple way to control the colors that are drawn It s basically a ColorMa
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 当我使用 Image.FromFile() 时 FileNotFound

    我在这种情况下使用 Image FromFile string 方法 using System using System Collections Generic using System ComponentModel using Syste
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象

随机推荐