Tag:开源控件 , 源码下载 , 控件开发 , 控件美化 , 窗体换肤 , Skin , QQ表情 , Windows API , GDI+编程 , SQLite , Socket , 控件透明 , 下拉控件 , HTML 解析器 , 图片水印 , ScrollBar(滚动条) , Google Sitemap , 数据库 , SQL , WinForm , P/Invoke , PartMaskTextBox 掩码输入控件

 
您的位置: >> 首页 >> C# 视角 >> C# 实现部分掩码显示和限制输入内容的TextBox控件

C# 实现部分掩码显示和限制输入内容的TextBox控件

2009-09-17  来自:CS 程序员之窗  字体大小:【  
  • 摘要: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