AlphaBlendTextBox - .NET 的透明/半透明文本框






4.85/5 (71投票s)
.NET 的透明/半透明文本框
引言
在开发另一个多媒体程序时,我发现自己需要一个 .NET 的透明编辑控件(TextBox
)。我很快发现,如果市面上存在这样的控件,那它一定非常透明以至于我找不到。在我搜索的过程中,我发现 IE 托管的网页按钮有一个 AlphaBlend 滤镜可用,但我找不到适用于 Win Forms 的。于是我着手自己编写一个。
我在此呈现的是 AlphaBlendTextBox 的 1.0 版本,用 C# 编写。请注意,它未经充分测试,未优化,也未在任何生产系统中使用。不过,我想将其提交到这里,希望你们中的一些人能发现这个控件及其源代码是有用的。
重要提示:我使用 Visual Studio .NET 2003 和 .NET framework 1.1 来创建此控件和示例项目。一旦有能力,我会发布一个 VS2002 .NET 1.0 版本。
背景
在设计这个控件时,我决定最好的方法是继承现有的 TextBox
控件,这样新控件就可以在任何可以使用原始 TextBox
控件的地方使用。一个快速的发现是,继承 TextBox
控件非常棘手。许多程序员都提到,这可能是一个“要么全有,要么全无”的过程。
这是因为在 .NET 的当前版本中,TextBox
控件只是对旧的 Win32 控件的一个封装。这使得修改变得困难。如果你重写控件的 OnPaint
方法,它会被忽略,除非你将控件的样式更改为 UserPaint
。然而,这样做会导致控件根本无法自行绘制,直到用户选择一些文本,即使那样,绘制也是不稳定的。
回到我最初的问题。我想要一个对背景透明的 TextBox
控件。在查阅帮助文件时,我注意到 .NET 控件有一个新的样式叫做 SupportsTransparentBackColor
,这似乎能解决问题。然而,这个样式要求设置 UserPaint
样式,正如上面提到的,这会导致 TextBox
控件无法自行绘制。更糟糕的是,即使 TextBox
绘制了,它仍然有一个实心的背景。
经过几周的沮丧,我找到了这个解决方案:继承 TextBox
控件,并在控件中添加一个 PictureBox
来显示,而不是原始的 TextBox
。
当控件需要绘制时,它会执行以下操作:
- 暂时将
UserPaint
样式设置为false
- 通过发送
WM_PRINT
消息捕获原始TextBox
的位图 - 切换回
UserPaint
样式 - 使用 ColorMap 将实心背景转换为透明/Alpha 背景
- 确定插入光标的位置并根据需要绘制
- 然后将新的 Alpha 图像复制到
PictureBox
,绘制时它将与背景混合
此外,还必须重写 PictureBox
,以便任何发送给它的鼠标事件都被重定向到 TextBox
。同时,TextBox
的一些公共属性和方法也必须被重写,例如 Font
、MultiLine
等。
使用代码
该控件可以使用与标准 TextBox
控件相同的方式使用。我已将该控件编译成一个控件库(DLL)文件。要从 Visual Studio 设计器中使用此控件,只需右键单击工具栏并选择“添加/删除项”,然后单击“浏览”,然后浏览到 _AlphaBlendTextBox.dll_ 文件。完成此操作后,AlphaBlendTextBox 控件应会出现在您的工具栏中(如果您使用 VS2003,则可能在“我的用户控件”下)。现在您可以将控件拖放到窗体上,并像使用原始 TextBox
控件一样使用它。该控件有一个名为 BackAlpha
的新属性,允许您设置控件的背景 alphablend
值。范围是从 0(透明)到 255(不透明),或介于两者之间以实现半透明。
使用该控件的另一种方法是将其添加到您的项目中,使用“项目:添加引用”菜单。该控件位于 ZBobb
命名空间下,因此您可以使用如下代码:
// Sample C# code private ZBobb.AlphaBlendTextBox alphaBlendTextBox1; private void Form1_Load(object sender, System.EventArgs e) { alphaBlendTextBox1 = new ZBobb.AlphaBlendTextBox(); alphaBlendTextBox1.Location = new System.Drawing.Point(32, 16); this.alphaBlendTextBox1.Text = "Hello"; alphaBlendTextBox1.BackAlpha = 0; // Totally transparent this.Controls.Add(this.alphaBlendTextBox1); }
该控件也可以在 Visual Basic .NET 中使用,并且我包含了一个 VB 示例项目。
结论
这是我第一次在 Code Project 上发布。Code Project 一直是我编程的巨大帮助来源,我很高兴终于能有所回报。我期待听到您的评论和建议,并希望这次发布能对您有所帮助。
历史
- 1.0 版本发布于 2003 年 6 月 24 日。