C#自定义控件VS用户控件

C#中自定义控件VS用户控件大比拼

1 自定义控件与用户控件区别

WinForm中,

用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Controls控件

自定义控件(Custom Control):继承自 Control,主要用于开发windows控件的最基本的类,比如 Text,Button 控件

2 要开发自己的控件的几种方法[1]

复合控件(Composite Controls):将现有的各种控件组合起来,形成一个新的控件,来满足用户的需求。

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

自定义控件(Custom Controls):就是直接从System.Windows.Forms.Control类派生,也就是说完全由自己来设计、实现一个全新的控件,这是最灵活、最强大的方法,但是,对开发者的要求也是最高的。要实现一个自定义控件,必须为Control类的的OnPaint事件编写代码,在OnPaint事件中实现自定义控件的绘制工作。同时,还可以重写Control类的WndProc方法,来处理底层的Windows消息。所以说,要实现一个自定义控件,对开发者的要求较高,要求开发者必须了解GDI+和Windows API的知识。

3 示例:Clock User Control[1]

源代码

Steps:

1. 新建一个Windows控件库项目(从UserControl派生)

2. 添加一个Timer控件,并设置属性(Enable=True, Interval=1000)和事件 (Ticker=Time1_Tick)

private void timer1_Tick(object sender, EventArgs e)
   {

      this.Time = DateTime.Now;    

      Refresh();
   }

3. 重写OnPaint事件,绘制用户界面

图1 重写OnPaint事件,绘制用户界面

#region draw clock
    private void UserClock_Paint(object sender, PaintEventArgs e)
    {
      Graphics dc = e.Graphics;
      Pen pn = new Pen(ForeColor);
      SolidBrush br = new SolidBrush(ForeColor);
      initCoordinates(dc);
      DrawDots(dc, br);
      DrawHourHand(dc, pn);
      DrawSecondHand(dc, pn);
      DrawMinuteHand(dc, pn);
    }

    public void initCoordinates(Graphics dc)
    {
      if (this.Width == 0 || this.Height == 0) return;
      dc.TranslateTransform(this.Width / 2, this.Height / 2);
      dc.ScaleTransform(this.Height / 250F, this.Width / 250F);
    }
    public void DrawDots(Graphics dc, Brush brush)
    {
      int iSize;
      for (int i = 0; i <= 59; i++)
      {
        if (i % 5 == 0)
        {
          iSize = 15;
        }
        else
        {
          iSize = 5;
        }
        dc.FillEllipse(brush, -iSize / 2, -100 - iSize / 2, iSize, iSize);
        dc.RotateTransform(6);
      }
    }
    public virtual void DrawHourHand(Graphics grfx, Pen pn)
    {
      GraphicsState gs = grfx.Save();
      grfx.RotateTransform(360.0F * Time.Hour / 12 + 30.0F * Time.Minute / 60);
      grfx.DrawLine(pn, 0, 0, 0, -50);
      grfx.Restore(gs);
    }
    public virtual void DrawMinuteHand(Graphics grfx, Pen pn)
    {
      GraphicsState gs = grfx.Save();
      grfx.RotateTransform(360.0F * Time.Minute / 60 + 6.0F * Time.Second / 60);
      grfx.DrawLine(pn, 0, 0, 0, -70);
      grfx.Restore(gs);
    }
    public virtual void DrawSecondHand(Graphics grfx, Pen pn)
    {
      GraphicsState gs = grfx.Save();
      grfx.RotateTransform(360.0F * Time.Second / 60);
      grfx.DrawLine(pn, 0, 0, 0, -100);
      grfx.Restore(gs);
    }
    #endregion

4. 生成用户控件

5. 测试用户控件

创建WinForm应用程序,在Toolbox添加Tab "User Control",再往其中拖入第4步中生成的自定义控件的dll文件。再把Toolbox中的用户控件“UserControlClock”拖到界面“Form1”中,如下图所示。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#自定义控件实现TextBox禁止粘贴的方法

    本文实例讲述了C#自定义控件实现TextBox禁止粘贴的方法.分享给大家供大家参考,具体如下: 开发环境:Visual Studio .net 2005 + Windows XP sp2 professional 新建->项目->Windows控件库: 新建一个类,继承自TextBox类,具体源代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawi

  • C#与js实现去除textbox文本框里面重复记录的方法

    本文以实例形式展示了C#与js实现去除textbox文本框里面重复记录的方法!具体方法如下: 现有如下问题:页面有一个textbox文本框(是多行的),比如我在文本框里面输入:111,222,333,555当再输入111的时候会自动清除掉这个111,或者是在提交一个按钮前清除掉这个相同记录! 解决方案如下: 以逗号分割成一个数组 有一个Split()方法 然后比较 里面相等的就删除掉后面的那个 形成新的实例 再把新实例按格式输进来~ C#代码如下: string temp_str = "111,

  • C#禁止textbox复制、粘贴、剪切及鼠标右键的方法

    本文实例讲述了C#禁止textbox复制.粘贴.剪切及鼠标右键的方法.分享给大家供大家参考.具体如下: class MyTextBox : System.Windows.Forms.TextBox { protected override void WndProc(ref System.Windows.Forms.Message m) { if (m.Msg != 0x007B && m.Msg != 0x0301 && m.Msg != 0x0302) { base.Wn

  • C#实现绑定DataGridView与TextBox之间关联的方法

    本文实例讲述了C#实现绑定DataGridView与TextBox之间关联的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace System.Window

  • C# TextBox 扩展方法数据验证详细说明

    查看公司项目代码时,存在这样一个问题:winform界面上有很多信息填写,提交后台服务器更新,但数据的合法验证及值的转换却不太敢恭维,一堆的if判断和转换,便想着是否能扩展个方法出来,琢磨出个思路,记录下来与大家共同探讨,有不对的地方还请大家指正. 设计思路: 1. 由于大部分从TextBox控件中获取数据值,可以扩展个泛型方法出来,直接根据转换后的数据类型获得值,类似这样, var value = this.txtSample.GetValue<int>(); 2. 可以传入一个委托用来处理

  • C#自定义控件添加右键菜单的方法

    C#自定义控件添加右键菜单非常简单,主要用到控件,像control定义右键菜单,用items.add()叠加右键菜单内容,用click事件处理函数. 1.control是要定义右键菜单的控件. private void control_MouseDown(object sender, MouseEventArgs e) {    if (e.Button == MouseButtons.Right)    {        ContextMenu menu = new rightClickMen

  • C#实现用户自定义控件中嵌入自己的图标

    本文实例讲述了C#实现用户自定义控件中嵌入自己的图标.分享给大家供大家参考,具体如下: 下面给出一下具体的步骤. 1. 新建一个用户控件 2. 向资源文件是添加一张图片,图片格式可以是bm,ico 大小最好是 16 * 16 啦! 3. 选中用户控件图标,单击"右键>属性"把 "生成操作 的属性值改为:嵌入的资源(Action Resource) 4. 第四步: [ToolboxBitmap(typeof(CutPitureNew_WPF), "CutPitu

  • C#中TextBox实现输入提示功能的方法

    本文实例讲述了C#中TextBox实现输入提示功能的方法.分享给大家供大家参考.具体如下: 设置TextBox的AutoCompleteSource的属性为CustomSource,设置TextBox的AutoCompleteMode属性为SuggestAppend. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawin

  • C#中设置textbox限制条件的方法

    本文实例讲述了C#中设置textbox限制条件的方法,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: #region 设置数量等textbox控件样式及限制条件(具体调用的方法就是重写或直接调用ShieldNumberTextBoxOtherKeys函数) /// <summary> /// 屏蔽数字textbox的其他字符串 /// </summary> /// <param name="sender"></param>

  • C#递归遍历窗体所有textbox控件并设置textbox事件的方法

    本文实例讲述了C#递归遍历窗体所有textbox控件并设置textbox事件的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public virtual void SetTextBo

  • 解析C#自定义控件的制作与使用实例的详解

    上篇:控件制作本例是制作一个简单的自定义控件,然后用一个简单的测试程序,对于初学者来说,本例子比较简单,只能起到抛石引玉的效果.我也是在学习当中,今后会将自己所学的逐步写出来和大家交流共享.第一步:新建一个控件库项目:myControl 第二步:从工具箱里面拖动1个PictureBox.1个Button.6个Lable控件到用户界面上,布局如下: 如上图,设置pictureBox的Name为picBox,背景为白色,Button的Name为btnOpen,另外靠左的三个Lable的Text属性分

  • C# TextBox控件实现只能输入数字的方法

    只需要在控件TextBox的keypress事件中写入如下代码即可满足要求: 代码如下: 复制代码 代码如下: if (e.KeyChar == '.' && this.txbEnd.Text.IndexOf(".") != -1)             {                 e.Handled = true;             } if (!((e.KeyChar >= 48 && e.KeyChar <= 57) |

随机推荐