使用 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 渲染 的相关文章

随机推荐