WinForm自定义控件–TextBox扩展

 

一、简单回顾

在前两节中,对Panel和GroupBox控件进行了相关的扩展应用,主要都是设置控件的边框以及边框颜色等。本节,继续对WinForm现有的控件TextBox进行扩展,来满足实际开发中的需要。

 

二、TextBox扩展

WinForm现有的TextBox控件功能已然相当强大了,但有些时候仍然不能满足一些实际开发的需要,本节针对开发中的需求问题,对控件进行了以下扩展:

1、 和以往一样,设置控件的边框问题,主要有:边框颜色、边框粗细;

2、 控件添加水印文字效果,可以设置水印文字颜色以及字体等;

3、 实现控件对常规输入项的验证效果,比如:数字、电话号码、电子邮件等;对不符合规则的输入进行错误提示。

 

(I)、边框扩展

为自定义控件添加边框颜色和边框粗细这两个属性;然后WinProc方法中重绘边框,是重新绘制一个矩形遮盖原有的线条,这里采用的方法和前两节基本相似。

(II)、水印提示

为控件添加水印效果的提示,方便于用户的输入提示,水印文字实际上就是通过TextRenderer的DrawText 方法将提示文字绘制到TextBox文本框中的。

(III)、输入验证

当用户在即时输入的过程中,就对输入内容进行规则验证,判断输入是否正确,若不正确,则提示输入出错。这里主要采用了正则表达式来进行验证,在用户输入过程中,触发OnTextChanged函数,然后验证输入的文本。

本节中主要可以进行如下验证:

默认、数字、汉字、邮政编码、电子邮件、座机电话号码、中国电话号码、手机号码、整数、负整数、浮点数、非负浮点数、正浮点数、非正浮点数、负浮点数、英文字符、大写英文字符、小写英文字符、数字和英文字母、数字、英文字母或下划线、URL、QQ、身份证、IP、"2000-2-28 23:29:59"、"2000-2-28"、年份、月份、日、"23:29:59"、"2000-02-29 10:29:39 pm"、"2009年2月28日"

关键代码如下:

  1. protectedoverridevoid WndProc(ref Message m)
  2. {
  3. base.WndProc(ref m);
  4. this.BorderStyle = BorderStyle.FixedSingle;
  5. if (m.Msg == WM_PAINT || m.Msg == WM_NCPAINT)
  6. {
  7. if (this.BorderWeight % 2 == 0)
  8. {
  9. this.BorderWeight -= 1;
  10. }
  11. using (Graphics g = Graphics.FromHwnd(this.Handle))
  12. {
  13. using (Pen pen = new Pen(this.BorderColor, this.BorderWeight))
  14. {
  15. g.DrawRectangle(pen, 0, 0, Size.Width - 1, Size.Height - 1);
  16. }
  17. }
  18. WmPaint();
  19. }
  20. }
  21. privatevoid WmPaint()
  22. {
  23. using (Graphics graphics = Graphics.FromHwnd(base.Handle))
  24. {
  25. if (Text.Length == 0 && !string.IsNullOrEmpty(_waterMarkText) && !Focused)
  26. {
  27. TextFormatFlags format = TextFormatFlags.EndEllipsis | TextFormatFlags.VerticalCenter;
  28. if (RightToLeft == RightToLeft.Yes)
  29. {
  30. format |= TextFormatFlags.RightToLeft | TextFormatFlags.Right;
  31. }
  32. TextRenderer.DrawText(graphics, _waterMarkText, this.WaterMarkFont, base.ClientRectangle, _waterMarkTextColor, format);
  33. }
  34. }
  35. }

关键代码就是这么多,其实也都很简单,下面来看下实现的效果:

控件完成后,添加到窗体当中,则有如下自定义属性:

2010-09-10_211138

控件运行效果如下:

2010-09-10_202138

2010-09-10_210353

运行状态下,红色边框的为出错提示。

三、关联知识补遗

1、C#TextRenderer类相关应用

TextRenderer 类提供了一组 static 方法,可用于在 Windows 窗体控件上测量和绘制文本。

 

2、正则表达式的相关应用

C#中的正则表达式包含在.NET基础类库的一个名称空间下,这个名称空间是System.Text.RegularExpressions。

该命名空间包括8个类,1个枚举,1个委托。他们分别是:
Capture: 包含一次匹配的结果;
CaptureCollection: Capture的序列;
Group: 一次组记录的结果,由Capture继承而来;
GroupCollection:表示捕获组的集合
Match: 一次表达式的匹配结果,由Group继承而来;
MatchCollection: Match的一个序列;
MatchEvaluator: 执行替换操作时使用的委托;
Regex:编译后的表达式的实例。
RegexCompilationInfo:提供编译器用于将正则表达式编译为独立程序集的信息
RegexOptions 提供用于设置正则表达式的枚举值
Regex类中还包含一些静态的方法:
Escape: 对字符串中的regex中的转义符进行转义;
IsMatch: 如果表达式在字符串中匹配,该方法返回一个布尔值;
Match: 返回Match的实例;
Matches: 返回一系列的Match的方法;
Replace: 用替换字符串替换匹配的表达式;
Split: 返回一系列由表达式决定的字符串;
Unescape:不对字符串中的转义字符转义。

正则表达式在C#中的应该很简单就是一个简单的匹配,但是如何去写这个表达式则需要技巧和实践。

[PS:补充源代码下载]源代码

你可能感兴趣的:(WinForm)