需求描述
在平常的项目需求中,除了C#本身自带的一些控件,我们可能还需要更多的自定义性质的控件,那么如何去创建一个自定的控件,就是我们需要讨论的问题。
关键词
自定义控件,C#,测试测量界面
应用详述
当我们在网上免费资源中获得一些比较精美的图片,希望将其制作成希望的控件,需要如何操作呢?
1)首先我们有了如下按钮图片,如图1所示。
图1按钮图片
建立一个C#窗体应用程序,主窗体起名为JYSwitchDemo,向解决方案中再加入一个用户控件,起名为JYSwitch。
图2解决方案资源管理
2)控件做好后,会出现在内
图3在工具箱的显示
修改JYSwitch.cs的代码
a.修改构造函数
这些属性修改基本上都是常规套路模式,是为刷新方便而启用的。所以在使用过程中直接复制和粘贴就可以。
publicJYSwitch()
{
InitializeComponent();
//设置Style支持透明背景色并且双缓冲
this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
this.SetStyle(ControlStyles.DoubleBuffer,true);
this.SetStyle(ControlStyles.ResizeRedraw,true);
this.SetStyle(ControlStyles.Selectable,true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor,true);
this.SetStyle(ControlStyles.UserPaint,true);
this.BackColor=Color.Transparent;
//鼠标移动到控件时变成手型
this.Cursor=Cursors.Hand;
//初始生成时候的大小
this.Size=newSize(87,27);
//注册控件单击事件
this.Click+=newSystem.EventHandler(this.JYSwitch_Click);
}
b.添加自定义属性
在JYSwitch的类中,添加两种属性
第一个属性是:是否被选中(Checked)
第二个是:Switch显示样式(CheckStyleX)
添加下面的代码:
boolisCheck=false;
///summary
///是否选中
////summary
publicboolChecked
{
set{isCheck=value;this.Invalidate();}
get{returnisCheck;}
}publicenumCheckStyle
{
style1,
style2,
style3,
style4,
};
CheckStylecheckStyle=CheckStyle.style1;
///summary
///样式
////summary
publicCheckStyleCheckStyleX
{
set{checkStyle=value;this.Invalidate();}
get{returncheckStyle;}
}
c.添加自定义事件
添加一个事件就是checked值改变事件,添加如下的代码:
///summary
///事件
////summary
publiceventEventHandlerCheckChanged;
///summary
///单机按钮事件
////summary
///paramname="sender"/param
///paramname="e"/param
privatevoidJYSwitch_Click(objectsender,EventArgse)
{
isCheck=!isCheck;
this.Invalidate();
//这个需要在外部去定义才可以使用,这才是真正的内容
if(CheckChanged!=null)
{
//TODO
CheckChanged(sender,e);
}
}
这边调用本身的Click事件,如果我们在MainForm程序中注册了CheckChanged则会发出该事件,否则不会发出该事件。
d.重新绘制图片
1.首先将我们准备的好的图片导入到项目程序当中,点击Resources.resx
2.进入后添加资源→添加现有文件
3.选择已有图片,如图X所示。
4.可以生成对应的Resources.Deisgner.cs,并查看其命名控件的内容
图4导入图片到资源管理中
e.重载函数OnPaint,就是重新改变画图函数
protectedoverridevoidOnPaint(PaintEventArgse)
{
BitmapbitMapOn=null;
BitmapbitMapOff=null;
if(checkStyle==CheckStyle.style1)
{
bitMapOn=global::JYSwitchDemo.Properties.Resources.垂直开;
bitMapOff=global::JYSwitchDemo.Properties.Resources.垂直关;
}
elseif(checkStyle==CheckStyle.style2)
{
bitMapOn=global::JYSwitchDemo.Properties.Resources.垂直开2;
bitMapOff=global::JYSwitchDemo.Properties.Resources.垂直关1;
}
elseif(checkStyle==CheckStyle.style3)
{
bitMapOn=global::JYSwitchDemo.Properties.Resources.按钮开;
bitMapOff=global::JYSwitchDemo.Properties.Resources.按钮关;
}
elseif(checkStyle==CheckStyle.style4)
{
bitMapOn=global::JYSwitchDemo.Properties.Resources.水平开;
bitMapOff=global::JYSwitchDemo.Properties.Resources.水平关;
}
Graphicsg=e.Graphics;
Rectanglerec=newRectangle(0,0,this.Size.Width,this.Size.Height);
if(isCheck)
{
g.DrawImage(bitMapOn,rec);
}
else
{
g.DrawImage(bitMapOff,rec);
}
}
3)测试代码程序
编写完自定义控件之后进行编译,会在工具栏之后出现我们所做的自定义控件。将其拖出来。同时可以看见,控件的属性窗口和事件窗口中出现我们添加的属性和事件。
图5测试开关按钮
图6按钮属性以及事件
只要改变属性中CheckstyleX就可以修改我们按钮开关的样式了,十分方便!同时,可以将项目中输出类型进行改变,只要改变到类库输出,那么我就可以生成我们想要的dll,在其他程序中也可以使用了。
图7
程序下载
手把手教你制作第一个C#