WinForm自定义控件–TextBox扩展

  • A+
所属分类:C#

WinForm自定义控件–TextBox扩展 - 小锋神 - 博客园

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.
6. if (m.Msg == WM_PAINT || m.Msg == WM_NCPAINT)
7. {
8. if (this.BorderWeight % 2 == 0)
9. {
10. this.BorderWeight -= 1;
11. }
12. using (Graphics g = Graphics.FromHwnd(this.Handle))
13. {
14. using (Pen pen = new Pen(this.BorderColor, this.BorderWeight))
15. {
16. g.DrawRectangle(pen, 0, 0, Size.Width - 1, Size.Height - 1);
17. }
18. }
19. WmPaint();
20. }
21. }
22.
23.
24.
25. privatevoid WmPaint()
26. {
27. using (Graphics graphics = Graphics.FromHwnd(base.Handle))
28. {
29. if (Text.Length == 0 && !string.IsNullOrEmpty(_waterMarkText) && !Focused)
30. {

  1. TextFormatFlags format = TextFormatFlags.EndEllipsis | TextFormatFlags.VerticalCenter;

  2. if (RightToLeft == RightToLeft.Yes)

  3. {
  4. format |= TextFormatFlags.RightToLeft | TextFormatFlags.Right;
  5. }

  6. TextRenderer.DrawText(graphics, _waterMarkText, this.WaterMarkFont, base.ClientRectangle, _waterMarkTextColor, format);

  7. }

  8. }
  9. }

关键代码就是这么多,其实也都很简单,下面来看下实现的效果:
控件完成后,添加到窗体当中,则有如下自定义属性:

WinForm自定义控件–TextBox扩展

控件运行效果如下:

WinForm自定义控件–TextBox扩展

WinForm自定义控件–TextBox扩展

运行状态下,红色边框的为出错提示。
三、关联知识补遗****
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#中的应该很简单就是一个简单的匹配,但是如何去写这个表达式则需要技巧和实践。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin