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

 更新时间:2020年10月13日 11:07:06   作者:野狼谷  
这篇文章主要为大家详细介绍了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”中,如下图所示。

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

相关文章

  • C#创建WebService接口并连接的全过程

    C#创建WebService接口并连接的全过程

    工作时遇到需要请求客户的接口返回数据,要求使用WebService,借此机会记录一下,下面这篇文章主要给大家介绍了关于C#创建WebService接口并连接的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • C#控制台下测试多线程的方法

    C#控制台下测试多线程的方法

    这篇文章主要介绍了C#控制台下测试多线程的方法,涉及C#操作多线程的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C# CSV文件读写的实现

    C# CSV文件读写的实现

    本文主要介绍了C# CSV文件读写的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • C#如何动态设置屏幕分辨率

    C#如何动态设置屏幕分辨率

    这篇文章主要为大家详细介绍了C#动态设置屏幕分辨率的方法,我们可以使用Screen类设置屏幕分辨率,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • Unity实现相机截图功能

    Unity实现相机截图功能

    这篇文章主要为大家详细介绍了Unity实现相机截图功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 如何实现定时推送的具体方案

    如何实现定时推送的具体方案

    在工作当中遇到了一个需要定时向客户端推送新闻、文章等内容。小项目又用不了大框架,这个时候在网上搜了很久没有找到合适的解决方案,直到看到了一位大佬写的文章提供了一个非常不错的思路本篇文章也是受到他的启发实现了之后这里分享给大家
    2021-04-04
  • C#简单写入xml文件的方法

    C#简单写入xml文件的方法

    这篇文章主要介绍了C#简单写入xml文件的方法,可实现C#针对XML文件简单写入的功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#基于Linq和反射实现数据持久化框架Xml4DB详解

    C#基于Linq和反射实现数据持久化框架Xml4DB详解

    在本篇文章里小编给大家整理的是关于C#基于Linq和反射实现数据持久化框架Xml4DB相关知识点,有需要的朋友们学习下。
    2019-08-08
  • WPF 在image控件用鼠标拖拽出矩形的实现方法

    WPF 在image控件用鼠标拖拽出矩形的实现方法

    这篇文章主要介绍了WPF 在image控件用鼠标拖拽出矩形的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • unity实现动态排行榜

    unity实现动态排行榜

    这篇文章主要为大家详细介绍了unity实现动态排行榜,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论