自己动手写c#控件(button)

 



willsound(willsound@163.com)



关键词

c#,.net,控件,gdi+



我平时比较喜欢使用delphi,小生不才,我随然喜欢delphi,平时开发(至少现在)多用delphi,但是不怕各位高手笑话,我没有用delphi写过控件,虽然原理上知道,但总感觉不知无从下手:l

但是自从接触了c#,她哪优美的身姿(代码风格),风骚而不放纵的性格(对面向对象的体现比较好,要比delphi强),深深打动了我。经过一段时间的操练,我发现在开发控件及组件上(别的方面,小生我不敢妄断),其简便性真令我耳目一新。怎么样,试一把吧.j

对了,我的开发平台是windows 2000 server+.vs.net 正式版

我所实现的这个控件,是从窗体控件button继乘的,能够实现渐变背景,实现图案及纹理填充文字.

好了,我们开在开始吧

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。

谁如果需要源码的话,请给我发信.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值