小二哥's blog

----zhangzs8896(小二)

导航

自己动手写C#控件

Posted on 2004-10-18 10:16  小二哥  阅读(1328)  评论(0编辑  收藏  举报

测试环境: Win2003 Server + Vs.net2003
简单应用:


现在开始 step by step

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;
public class LinearGradientButton : System.Windows.Forms.Button
 {}下定义控件需要的私有域,代码如下:

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事件了.

好了,现在开始重写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.        名称框中键入 MyTest 
    
4.        在解决方案资源管理器中,右击测试项目的引用节点,然后从快捷菜单中选择添加引用
         以显示添加引用对话框。
    5.        单击标记为项目的选项卡。
   
6.        双击 LinearGradientButtonLib 项目,并注意该项目此时出现在选定的组件窗格中。 
   
    添加引用后,应将新控件添加到工具箱。如果您的控件已经出现在工具箱中,则应该跳过下一节。

将控件添加到工具箱

1.        点击工具箱,右键Windows窗体,“添加/删除项“,打开自定义工具箱

2.        选择“.NET 框架组件选项卡并单击浏览。浏览到 LinearGradientButtonLib\bin\debug 文件夹并选择 LinearGradientButtonLib.dll
默认情况下这个文件存放在:
[系统盘:\Documents and Settings\Administrator\My Documents\Visual Studio Projects\MyTest\bin\Debug]
LinearGradientButton 出现在“自定义工具箱”对话框的组件列表中。

3.        自定义工具箱对话框中,单击 LinearGradientButton 旁的框并关闭窗口。
LinearGradientButton 被添加到选定的工具箱的选项卡上。

将控件添加到窗体

1.        在解决方案资源管理器中,右击“Form1.cs”,然后从快捷菜单中选择视图设计器

2.        在工具箱中,向下滚动直到到达标记为 LinearGradientButton 的图标。双击该图标。 窗体上显示一个LinearGradientButton”。

3.        右击LinearGradientButton并从快捷菜单中选择属性

4.        属性窗口中检查该控件的属性。注意,它们与标准按钮公开的属性相同,不同的是多了我们自己加入的一些属性

5.        设定本控件的前景色及背景色,然后可以选择是否填充文字,是使用角度还是使用系统设定值进行渐变角度的变化。

6.        调试菜单中选择启动 出现 Form1

作者BLOG:http://blog.csdn.net/uncommon