65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (71投票s)

2003年6月24日

CPOL

4分钟阅读

viewsIcon

609166

downloadIcon

32959

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

Sample Image - AlphaBlendTextBox1.gif

引言

在开发另一个多媒体程序时,我发现自己需要一个 .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 的一些公共属性和方法也必须被重写,例如 FontMultiLine 等。

使用代码

该控件可以使用与标准 TextBox 控件相同的方式使用。我已将该控件编译成一个控件库(DLL)文件。要从 Visual Studio 设计器中使用此控件,只需右键单击工具栏并选择“添加/删除项”,然后单击“浏览”,然后浏览到 _AlphaBlendTextBox.dll_ 文件。完成此操作后,AlphaBlendTextBox 控件应会出现在您的工具栏中(如果您使用 VS2003,则可能在“我的用户控件”下)。现在您可以将控件拖放到窗体上,并像使用原始 TextBox 控件一样使用它。该控件有一个名为 BackAlpha 的新属性,允许您设置控件的背景 alphablend 值。范围是从 0(透明)到 255(不透明),或介于两者之间以实现半透明。

Properties snap shot

使用该控件的另一种方法是将其添加到您的项目中,使用“项目:添加引用”菜单。该控件位于 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 日。
© . All rights reserved.