C# 实现部分掩码显示和限制输入内容的TextBox控件
- 摘要:C#实现对TextBox控件的扩展,让部分内容显示为掩码,并限制输入的内容(默认为只能输入数字,可以自己设置),不能选择文本内容,而且可以使用水印文本提示用户输入。
应网友的要求,写了一个部分输入内容用掩码显示的TextBox控件,先看看实现了那些功能:PartMaskTextBox 可以实现设置输入几位后用掩码显示,可以控制输入的内容(默认为只能输入数字,可以自己设置)和输入内容的最大长度,不能拷贝、复制、粘贴、剪切,只能像QQ密码输入框那样,从最后一位开始删除,不能选择输入的文本,当文本内容为空,而控件没有获得焦点时,显示提示信息。来看看最终的效果:
这个控件继承前面写的一个WatermarkTextBox控件,让它可以实现水印文本提示的功能,下面看看整个控件的类视图:
先介绍一下几个重要的内容:
1、 MaskChar:设置显示的掩码内容,默认为“*”;
2、 MaskIndex:设置第几为后面开始显示为掩码。
3、 RealText:获取真实的输入内容。
4、 TextMaxLength:设置最大可以输入的内容长度。
5、 TextMinLength: 设置最小的输入内容长度。
6、 ValidateChar:一个ValidateCharHandler代理对象,验证每个输入的字符是否符合要求,默认为只能输入数字。
7、MaskLength:设置显示为掩码内容的长度。(新版本增加的功能)
下面介绍几个实现的重点:
1、 限制用户选择输入内容和改变光标的位置,用户通过鼠标和SHIFT+UP\DOWN\LEFT\RIGHT键可以悬着文本内容和改变光标的位置,主要通过重写下面两个方法实现限制:
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
base.SelectionStart = base.Text.Length;
Capture = false;
}
![]()
protected override bool ProcessCmdKey(
ref Message msg, Keys keyData)
{
if ((keyData & Keys.Shift) == Keys.Shift)
{
if ((keyData & Keys.Left) == Keys.Left ||
(keyData & Keys.Right) == Keys.Right ||
(keyData & Keys.Up) == Keys.Up ||
(keyData & Keys.Down) == Keys.Down)
{
return true;
}
}
![]()
if (keyData == Keys.Left ||
keyData == Keys.Right ||
keyData == Keys.Up ||
keyData == Keys.Down)
{
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
2、 限制用户的输入和设置部分内容显示为掩码。重写WndProc方法,截取WM_CHAR消息进行处理:
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_CHAR:
int keyChar = m.WParam.ToInt32();
bool backspace = keyChar == 8; //退格
bool cut = keyChar == 24; //剪切
bool copy = keyChar == 3; //拷贝
bool paste = keyChar == 22; //粘贴
if (backspace)
{
base.SelectionStart = base.Text.Length;
if (StringBuilder.Length > 0)
{
StringBuilder.Remove(_stringBuilder.Length - 1, 1);
}
}
else if (copy || cut || paste)
{
m.WParam = IntPtr.Zero;
}
else
{
if (StringBuilder.Length < _textMaxLength)
{
char ch = (char)keyChar;
if (IsValidChar(ch))
{
StringBuilder.Append(ch);
if (StringBuilder.Length > _maskIndex)
{
m.WParam = new IntPtr((int)_maskChar);
}
}
else
{
m.WParam = IntPtr.Zero;
}
}
else
{
m.WParam = IntPtr.Zero;
}
}
break;
}
base.WndProc(ref m);
}
主要解决了上面两点,就可以实现了。为什么要限制剪切、选择和粘贴呢,因为是部分内容显示为掩码,如果把前面不是掩码的部分删除了,后面的掩码部分就要显示到前面来了,那是还是用掩码显示,还是显示真实内容呢?显示真实内容,信息也就不安全了,显示为掩码,这个操作也就没什么意义了。所以就限制只能从最后一位开始删除内容和限制了剪切、选择和粘贴这些操作。
声明:
本文版权归作者和CS 程序员之窗所有,欢迎转载,转载必须保留以下版权信息,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者:Starts_2000
出处:CS 程序员之窗 http://www.csharpwin.com。
你可以免费使用或修改提供的源代码,但请保留源代码中的版权信息,详情请查看:
CS程序员之窗开源协议 http://www.csharpwin.com/csol.html。


}
}