自己动手用c#写控件

原创 2007年09月28日 14:05:00
1 首先打个vs.net
2文件菜单中,指向新建,然后选择项目以打开新建项目对话框。从“C# 项目列表中选择“Windows 控件库项目模板,然后在名称框中键入LinearGradientButtonLib,然后点确定。
3 在解决方案资源管理器中,右击 UserControl1.cs,并从快捷菜单中选择查看代码
4 找到 class 语句public class UserControl1,将 UserControl1 更改为LinearGradientButton以更改组件的名称。找到构造函数public UserControl1(),将它更改为public LinearGradientButton ()
5 Class 语句,将该控件从 System.Windows.Forms.UserControl 继承的类型更改为 System.Windows.Forms.Button。这允许继承的控件继承 Button 控件的所有功能。
6 在解决方案资源管理器中,单击 UserControl1.cs,并在属性窗口中,将 FileName 属性更改为LinearGradientButton.cs.
好了,到现在工作就告一段落了,下面的工作,是向咱们的控件添加属性了。喝口水,继续!
先加上名字空间using System.Drawing.Drawing2D;
1找到 class 语句。在紧靠 { 的后面键入下面的代码:
private Color froColor; //渐变前景色
          private Color backColor;//渐变背景色
          private bool isUseFloat;//是否使用角度转变
          private float angle;    //放置角度
          private LinearGradientMode mode;//设定渐变的角度
          private HatchStyle hatchStyle; //设定文本的填充图案
          private bool isUseStyle;//设定是否用图案填充图案
 
上面这些是我们控件需要的私有域,下面开始为每个私有域做它们对应的属性.在以上代码的下面,写入以下代码:
    [Description("设定按钮渐变的前景色"),Category("Appearance")]
         public Color FrontColor
         {
              get
              {
                   return froColor;
              }
              set
              {
                   froColor=value;
              }
         }
          [Description("设定按钮渐变的背景色"),Category("Appearance")]
         public Color BackGroundColor
         {
              get
              {
                   return backColor;
              }
              set
              {
                   backColor=value;
              }
         }
          [DefaultValue(false),Description("设定是否人工设定角度")]
         public bool UseFloat
         {
              get
              {
                   return isUseFloat;
              }
              set
              {
                   isUseFloat=value;
              }
         }
          [DefaultValue(false),Description("设定是否使用图案填充文本")]
         public bool UseStyle
         {
              get
              {
                   return isUseStyle;
              }
              set
              {
                   isUseStyle=value;
              }
         }
          [DefaultValue(0),Description("定义渐变方向的角度,以度为单位从 X 轴顺时针测量。 "),Category("Appearance")]
         public float Angle
         {
              get
              {
                   return angle;
              }
              set
              {
                   angle=value;
              }
         }
          [DefaultValue(0),Description("当UseFloat设为false时,设定渐变方向。 "),Category("Appearance")]
         public LinearGradientMode Mode
         {
              get
              {
                   return mode;
              }
              set
              {
                   mode=value;
              }
         }
          [DefaultValue(false),Description("设定文本要填充的图案"),Category("Appearance")]
         public HatchStyle FillStyle
         {
              get
              {
                   return hatchStyle;
              }
              set
              {
                   hatchStyle=value;
              }
         }
好了,我们将控件的属性设计好了,下面就要我们写事件了.

因为我们这个控件是实现背景渐变及文字填充,所以override Paint事件以完成自画。
为了完成override,现在以下的准备工作(写几个在Paint事件用的着的事件).
//使用角度的方法渐近重画Button
          private void DrawButtonWithAngle(Graphics dbg)
         {
              LinearGradientBrush brush=new LinearGradientBrush(new Rectangle(0,0,this.Width,this.Height),froColor,backColor,angle);
              dbg.FillRectangle(brush,0,0,this.Width,this.Height);
              brush.Dispose();
         }
         ////使用模式的方法渐近重画Button
          private void DrawButtonWithMode(Graphics dbg,LinearGradientMode Mode)
         {
              LinearGradientBrush brush=new LinearGradientBrush(new Rectangle(0,0,this.Width,this.Height),froColor,backColor,Mode);
              dbg.FillRectangle(brush,0,0,this.Width,this.Height);
              brush.Dispose();
         }
         //重画Button的文本(Text),不使用图案填充
          private void DrawButtonText(Graphics dbg)
         {
              StringFormat format=new StringFormat();
              format.LineAlignment=StringAlignment.Center;
              format.Alignment=StringAlignment.Center;
              dbg.DrawString(this.Text,this.Font,new SolidBrush(this.ForeColor),new Rectangle(0,0,this.Width,this.Height),format);
         }
          //override DrawButtonText函数,使之可以用图案填充文本
          private void DrawButtonText(Graphics dbg, HatchStyle hs)
         {
              StringFormat format=new StringFormat();
              format.LineAlignment=StringAlignment.Center;
              format.Alignment=StringAlignment.Center;
              dbg.DrawString(this.Text,this.Font,new HatchBrush(hs,this.ForeColor,Color.Aquamarine),new Rectangle(0,0,this.Width,this.Height),format);
     }
好了,现在开始重写Paint事件了.
protected override void OnPaint(PaintEventArgs pe)
         {
             
              Graphics g=pe.Graphics;
              base.OnPaint(pe); //调用父控件的方法
              if(isUseFloat==true) //假如使用角度控制渐变的角度
                   DrawButtonWithAngle(g);
              if(isUseFloat==false)
                   DrawButtonWithMode(g,mode);
              if(isUseStyle==true)//假如使用图案填充文字
             DrawButtonText(g,hatchStyle);
              else
                   DrawButtonText(g);
     }
好了,现在大功告成了,进行保存,生成。
创建测试项目
1.        文件菜单上,指向添加项目,然后单击新建项目以打开添加新项目对话框。
2.        选择“Visual C# 项目节点,然后单击“Windows 应用程序
3.        名称框中键入 Test
4.        在解决方案资源管理器中,右击测试项目的引用节点,然后从快捷菜单中选择添加引用以显示添加引用对话框。
5.        单击标记为项目的选项卡。
6.        双击LinearGradientButtonLib 项目,并注意该项目此时出现在选定的组件窗格中。
添加引用后,应将新控件添加到工具箱。如果您的控件已经出现在工具箱中,则应该跳过下一节。
将控件添加到工具箱
1.        右击工具箱,然后从快捷菜单中选择自定义工具箱
“自定义工具箱”对话框打开。
2.        选择“.NET 框架组件选项卡并单击浏览。浏览到LinearGradientButtonLib/bin/debug 文件夹并选择LinearGradientButtonLib.dll
LinearGradientButton 出现在“自定义工具箱”对话框的组件列表中。
3.        自定义工具箱对话框中,单击LinearGradientButton旁的框并关闭窗口。
LinearGradientButton 被添加到选定的工具箱的选项卡上。
将控件添加到窗体
1.        在解决方案资源管理器中,右击“Form1.cs”,然后从快捷菜单中选择视图设计器
2.        在工具箱中,向下滚动直到到达标记为LinearGradientButton的图标。双击该图标。
窗体上显示一个“LinearGradientButton”。
3.        右击LinearGradientButton并从快捷菜单中选择属性
4.        属性窗口中检查该控件的属性。注意,它们与标准按钮公开的属性相同,不同的是多了我们自己加入的一些属性
5.        设定本控件的前景色及背景色,然后可以选择是否填充文字,是使用角度还是使用系统设定值进行渐变角度的变化。
6.        调试菜单中选择启动出现 Form1
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

自己动手用c#写控件

android动手写平滑滚动歌词控件

马上毕业了,前段时间一直忙自己的毕业设计和毕业论文(蛋疼连着菊花疼),做的是一个android音乐播放器,今天特意抽出里面的一块功能来凑这篇博客--歌词的显示。 看看QQ音乐,歌词显示略屌,可惜我们的...

自己动手写 accordion 抽屉控件

//EXTUI 控件核心库 (function ($) { $.extUI = {}; $.extUI.controls = {}; //组件类 ...

自己动手写类似酷狗播放器(3)_Slider控件使用

本节总结下音乐播放中slider控件的使用,包括两个方面,slider控制播放时间和控制播放声音(这里不是系统的音量)而是声道的音量.      目标:1.通过播放进度条来控制播放进度 2.通...

Android自己动手做查找控件、绑定监听的注解框架

现在好多第三方开发框架都提供了注解方式设置控件绑定监听的方法。本着知其然知其所以然的态度,今天小菜自己撸了一遍,其中不少参考了xUtils的源码,在这里特别感谢下大神的开源精神,感谢巨人为我们提供肩膀...

C#中,datagridview与sql数据源绑定后,通过控件更改数据如何自动回写更新到数据源

以前一直在绕弯路,其实用c#自己的datagridview的数据绑定向导有便利的特征,就是能够简单的显示数据库中的某个表,但是问题是,对datagridview的更改无法通过简单的方法回写到数据库中。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)