当前位置:嗨网首页>书籍在线阅读

11-扩展控件

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

23.3.2 扩展控件

扩展控件(Extended Controls)就是在现有的控件基础上派生出一个新的控件,增加新的功能或者修改原有功能,来满足用户需求。

扩展控件保留了原来控件的界面、属性、方法,同时还可以扩展原有控件功能,实现新的功能,满足用户需求。

扩展控件可以在以下两方面进行扩展。

(1)扩展用户界面,界面上有所变化,使界面更好看。

界面上要有所变化,就要重载OnPaint方法,对原有控件的界面进行重新绘制。

(2)扩展功能,功能上有所加强。

功能上有所加强就是指增加新的功能,满足用户需求。

1.扩展控件的创建

下面创建一个扩展TextBox的文本框控件,该控件有一个最大值和最小值属性,在文本框中只能输入数值,且只能有一个小数点,负号只能在最前面,数值要在最大值和最小值之间。

第一步,新建一个Windows窗体控件库项目,并命名为DigitalTextBox,单击“确定”完成项目创建工作,此时产生了一个UserControl界面,当我们从已有的控件中继承的时候,实际上这个界面是不需要的。

第二步,将该控件的name属性改变为NumTextBox ,同时其文件名称也改变为NumTextBox cs,这样一来,原来的用户控件界面就不存在了,也不需要了。

第三步,为了限制输入的内容,我们应该处理键盘的按键事件,在属性窗口中找到事件列表中的keyPress项并双击,自动添加事件处理方法的模板,如下图所示。

431.png 程序代码如下。

01  public partial class NumTextBox: System.Windows.Forms.TextBox
02  {
03          public NumTextBox()
04          {
05          InitializeComponent();
06          }
07          private decimal maxNum;
08          [Description("文本框可以输入的最大值"), Category("自定义")]
09          public decimal MaxNum
10          {
11          get { return maxNum; }
12          set { maxNum = value; }
13          }
14          private decimal minNum;
15          [Description("文本框可以输入的最小值"), Category("自定义")]
16          public decimal MinNum
17          {
18                  get { return minNum; }
19                  set { minNum = value; }
20          }
21          private void NumTextBox_KeyPress(object sender, KeyPressEventArgs e)
22          {
23          string userInputString = this.Text;
24          Boolean canInput = false;
25          char keyChar;
26          keyChar = e.KeyChar;
27          if ((keyChar >= '0') && (keyChar <= '9'))
28          canInput=true;
29          //退格也可以运行
30          if (keyChar == '\b')
31          canInput = true;
32          if (keyChar == '-')
33                  {
34                  //如果“-”已经存在
35                  if (userInputString.IndexOf('-') == -1)
36                  canInput = true;
37                  //如果“-”不在起始位置
38                  if (this.SelectionStart != 0)
39                  canInput = false;
40          }
41          if (keyChar == '.')
42          {
43                  if (userInputStringIndexOf('.') == -1)
44                  canInput = true;
45                  else
46                  canInput = false;
47          }
48          if (canInput == true && keyChar == '\b')
49          {
50                  decimal num = Decimal.Parse(userInputString + keyChar);
51                  if (num > maxNum || num < minNum)
52          {
53                  canInput = false;
54          }
55  }
56  }
57  //Handled 是个布尔值。获取或设置事件是否已被处理
58  //如果您不希望出现默认操作,则设置为真
59  if (canInput)
60  e.Handled = false;
61  else
62  e.Handled = true;
63  }
64  }

第四步,单击“生成”菜单,选择其中的“生成解决方案”菜单项,或单击“生成DigitalTextBox”就可以生成扩展控件的.dll文件。

第五步,为控件添加图标。在解决方案资源管理器中右击该控件的项目名称,单击“添加新项”,在“模板”窗格中选择“位图文件”,将 Name 更改为 NumTextBoxbmp。位图文件的名字必须要和类的名字一致。然后单击“打开”,新位图文件出现在解决方案资源管理器中并在设计器中打开。

在“属性”窗口中,将位图的 Height 和 Width 属性更改为 16。图标的大小必须为 16×16 像素,并设计该图标,最后保存并关闭位图文件。也可以拷贝一个图标文件,将其通过文件改名的方式来快速产生。在解决方案资源管理器中选择 NumTextBoxbmp,在“属性”窗口中将“生成操作” 属性更改为 “嵌入的资源”。

重新编译该控件的项目并生成新的*.dll文件。

2.扩展控件的使用

对于扩展控件,一般都是从需要扩展的那一类控件继承的,就像我们上面讲到的NumTextBox扩展控件是从TextBox类继承的,我们如果要在Windows应用程序中使用扩展控件,同样需要把扩展控件先添加到工具箱中,这个过程与复合控件一样,就不再赘述了。

下面是一个使用NumTextBox控件的例子,我们使用这个控件来表示信用卡的余额。界面如下图所示,通过属性窗口中的MaxNum和MinNum属性可以设置文本框允许输入的最大值和最小值。

432.png