该控件源代码来自于《C#应用程序开发全程演练》,由于书上的源代码没地方下载,我就自己把它敲进去了。
要生成一个用户自定义的控件,首先新建一个类库(class library)项目,然后添加相应的引用。在这里添加System.Windows.Forms——因为我们设计的是一个窗体控件,System.Runtime.InteropServices——用到了DllImport属性,System.ComponentModel、System.Windows.Forms.Design——需要更改设计时的属性。
然后代码如下:
1//在项目中选添加引用,添加System.Windows.Forms才能添加using
2using System.ComponentModel;
3using System.Windows.Forms;
4//在项目中添加对System.Design的引用
5using System.Windows.Forms.Design;
6using System.Runtime.InteropServices;
7
8namespace CustomControls
9{
10 /**//// <summary>
11 /// 该文本框限制用户只能输入数字或小数点
12 /// </summary>
13 //添加Designer属性,使这个内部类成为设计时的属性表示类
14 [Designer(typeof(NumbersOnlyTextBox.NumbersOnlyTextBoxDesigner))]
15 public class NumbersOnlyTextBox:System.Windows.Forms.TextBox
16 {
17
18 Static Fields#region Static Fields
19
20 //从user32.dll中引入MessageBeep函数
21 [DllImport("user32.dll")]
22 private static extern bool MessageBeep(uint uType);
23
24 #endregion
25
26 Method Overrides#region Method Overrides
27
28 //重载ProcessKeyEventArgs处理用户按键
29 protected override bool ProcessKeyEventArgs(ref Message m)
30 {
31 int keyValue=m.WParam.ToInt32();
32 //(keyValue>47&&keyValue<58) - Number 0-9
33 //keyValue==46 - Decimal point
34 //(keyValue>34&&keyValue<41) - Home,End,and Arrow Keys
35 //keyValue==8 - Backspace Key
36 if((keyValue>47&&keyValue<58)||keyValue==46||
37 (keyValue>34&&keyValue<41)||keyValue==8)
38 {
39 return base.ProcessKeyEventArgs(ref m);
40 }
41 else
42 {
43 //Delete Key
44 if(m.Msg==256&&keyValue==46)
45 {
46 return base.ProcessKeyEventArgs(ref m);
47 }
48 //Windows message id used to llimit 1 beep per keystroke
49 if(m.Msg==258)
50 {
51 MessageBeep(0);
52 }
53 return true;
54 }
55 }
56
57 #endregion
58
59 Internal Classes#region Internal Classes
60
61 /**//// <summary>
62 /// 设计时显示该控件的属性
63 /// </summary>
64 internal class NumbersOnlyTextBoxDesigner:ControlDesigner
65 {
66 Method Overrides#region Method Overrides
67 //从属性窗口中移除text属性
68 protected override void PostFilterProperties(System.Collections.IDictionary properties)
69 {
70 properties.Remove("Text");
71 }
72 #endregion
73 }
74 #endregion
75 }
76}
2using System.ComponentModel;
3using System.Windows.Forms;
4//在项目中添加对System.Design的引用
5using System.Windows.Forms.Design;
6using System.Runtime.InteropServices;
7
8namespace CustomControls
9{
10 /**//// <summary>
11 /// 该文本框限制用户只能输入数字或小数点
12 /// </summary>
13 //添加Designer属性,使这个内部类成为设计时的属性表示类
14 [Designer(typeof(NumbersOnlyTextBox.NumbersOnlyTextBoxDesigner))]
15 public class NumbersOnlyTextBox:System.Windows.Forms.TextBox
16 {
17
18 Static Fields#region Static Fields
19
20 //从user32.dll中引入MessageBeep函数
21 [DllImport("user32.dll")]
22 private static extern bool MessageBeep(uint uType);
23
24 #endregion
25
26 Method Overrides#region Method Overrides
27
28 //重载ProcessKeyEventArgs处理用户按键
29 protected override bool ProcessKeyEventArgs(ref Message m)
30 {
31 int keyValue=m.WParam.ToInt32();
32 //(keyValue>47&&keyValue<58) - Number 0-9
33 //keyValue==46 - Decimal point
34 //(keyValue>34&&keyValue<41) - Home,End,and Arrow Keys
35 //keyValue==8 - Backspace Key
36 if((keyValue>47&&keyValue<58)||keyValue==46||
37 (keyValue>34&&keyValue<41)||keyValue==8)
38 {
39 return base.ProcessKeyEventArgs(ref m);
40 }
41 else
42 {
43 //Delete Key
44 if(m.Msg==256&&keyValue==46)
45 {
46 return base.ProcessKeyEventArgs(ref m);
47 }
48 //Windows message id used to llimit 1 beep per keystroke
49 if(m.Msg==258)
50 {
51 MessageBeep(0);
52 }
53 return true;
54 }
55 }
56
57 #endregion
58
59 Internal Classes#region Internal Classes
60
61 /**//// <summary>
62 /// 设计时显示该控件的属性
63 /// </summary>
64 internal class NumbersOnlyTextBoxDesigner:ControlDesigner
65 {
66 Method Overrides#region Method Overrides
67 //从属性窗口中移除text属性
68 protected override void PostFilterProperties(System.Collections.IDictionary properties)
69 {
70 properties.Remove("Text");
71 }
72 #endregion
73 }
74 #endregion
75 }
76}
把项目Build一遍,就生成了一个dll文件,这个就可以供我们以后使用了。
使用自定义控件的时候,可以在右侧的工具箱里添加一个选项卡(右键点击,选择就行了),我取名为自定义控件,用来放置以后设计的自定义控件,然后添加/移除项——》浏览找到刚才生成的dll文件,确定后就可以把它添加到项目里了。
作一个自定义控件其实不是件很复杂的事,生成的控件还可以供以后复用,何乐而不为呢?