2011-01-06 17:01:12
作者:IT伯伯
所属分类:WinForm编程
阅读:1155
评论:9
标签:
C#, Panel, Winform编程, WinForm自定义控件
一、自定义控件介绍
在WinFrom中用户自定义控件大概有三种形式:
(1)、 自定义控件 :通过继承Control类创建一个新的用户控件。Control 类提供控件所需的所有基本功能(包括鼠标和键盘处理事件),但不提供控件特定的功能或图形界面。 在开发过程中,需要完成Control类的OnPaint事件代码,或者重写WndProc方法,需要使用到GDI+和Win32 API编程。
(2)、扩展控件 :在现有的控件基础上派生出新的控件,通过添加自定义属性、方法或其他功能来扩展原有控件。可以重写基类的OnPaint方法,或者WndProc方法。
(3)、复合控件 :将目前现有的控件组合到一起形成一个新的控件。复合控件从UserControl 类派生,基类 UserControl 为子控件提供了键盘路由并使子控件可以作为一个组进行相关工作。
二、扩展Panel控件
本节示例,在WinForm窗体控件Panel的基础上扩展一个新的控件。新控件需要实现:
1、Panel边框颜色可以自定义设置;
2、Panel可以设置一个圆角弧度。
我采用扩展控件的方式,来实现我所需要的控件,具体编码操作步骤如下:
I、在VS中新建一个项目,添加一个类文件取名为PanelEx继承Panel控件,如:public class PanelEx:Panel
II、添加所需要的扩展控件属性,边框颜色-BorderColor、边框圆角-Radius
III、重写WndProc方法
IV、设置控件在Visual Studio IDE工具栏图标
具体实现代码如下:
- [ToolboxBitmap(typeof(Panel))]
- public class PanelEx:Panel
- {
- private Color _borderColor = Color.FromArgb(23, 169, 254);
- private int _radius = 10;
- private RoundStyle _roundeStyle;
-
- private const int WM_ERASEBKGND = 0x0014;
- private const int WM_PAINT = 0xF;
-
- public PanelEx()
- : base()
- {
- }
-
- [DefaultValue(typeof(Color), "23, 169, 254"), Description("控件边框颜色")]
- public Color BorderColor
- {
- get { return _borderColor; }
- set
- {
- _borderColor = value;
- base.Invalidate();
- }
- }
-
- [DefaultValue(typeof(int), "10"), Description("圆角弧度大小")]
- public int Radius
- {
- get { return _radius; }
- set
- {
- _radius = value;
- base.Invalidate();
- }
- }
-
- protected override void WndProc(ref Message m)
- {
- try
- {
- base.WndProc(ref m);
- if (m.Msg == WM_PAINT)
- {
- if (this.Radius > 0)
- {
- using (Graphics g = Graphics.FromHwnd(this.Handle))
- {
- Rectangle r = new Rectangle();
- r.Width = this.Width;
- r.Height = this.Height;
- DrawBorder(g,r,this.Radius);
- }
- }
- }
- }
- catch(Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
-
- private void DrawBorder(Graphics g, Rectangle rect, int radius)
- {
- rect.Width -= 1;
- rect.Height -= 1;
-
- GraphicsPath path = new GraphicsPath();
-
- path.AddArc(rect.X, rect.Y, radius, radius, 180, 90);
- path.AddArc(rect.Right - radius , rect.Y, radius, radius, 270, 90);
- path.AddArc(rect.Right - radius , rect.Bottom - radius , radius, radius, 0, 90);
- path.AddArc(rect.X, rect.Bottom - radius , radius, radius, 90, 90);
-
- using (Pen pen = new Pen(this.BorderColor))
- {
- g.DrawPath(pen, path);
- }
- }
- }
编码完成后,控件效果如下:
1、在VS中控件属性框中,会出现所添加的两个属性项,如图所示:

2、控件运行效果,如图所示:

控件已经是有圆角的弧度,并且控件边框也是变成了自行设定的颜色。
三、关联知识补遗
1、C#属性温故(摘自MSDN)
•属性使类能够以一种公开的方法获取和设置值,同时隐藏实现或验证代码。
•get 属性访问器用于返回属性值,而 set 访问器用于分配新值。这些访问器可以有不同的访问级别。有关更多信息,请参见访问器可访问性。
•value 关键字用于定义由 set 索引器分配的值。
•不实现 set 方法的属性是只读的。
2、WndProc方法介绍
WndProc方法作用为处理Windows消息。在C#中,消息被Application类从应用程序消息队列中取出,然后分发到消息对应的窗体,窗体对象的第一个响应函数便是对象中的protected override void WndProc(ref System.Windows.Forms.Message e)方法。WndProc方法再根据消息的类型调用默认的消息响应函数(如OnMouseDown),默认的响应函数然后根据对象的事件字段(如this.MouseDown )中的函数指针列表,调用用户所加入的响应函数(如Form1_MouseDown1和Form1_MouseDown2),而且调用顺序和用户添加顺序一致。
语法为:
protected virtual void WndProc
(
ref Message m
)
参数m为要处理的WindowsMessage。
3、如何给控件加上工具栏图标
在类文件头部添加[ToolboxBitmap(typeof(Panel))] ,这样扩展后的控件在工具栏中图标则和Panel控件图标一致。
»
郑重声明:本文由
IT伯伯发布,所有内容仅代表个人观点。版权归
IT伯伯和
IT伯伯共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。
嗯,谢谢,
就是我想要的效果,万分感谢哦
不客气~
这个代码复制到程序上有问题啊 ,
能否把你图上显示的代码(解决方案)发到我邮箱去,
万分感激,希望能发送
这个就是完整的代码啊~图片上那4个框是这个控件的,窗体皮肤是另外的~
不是的,我已经实验了,复制这个代码,左边没有边框。
而且我只要上面两个角有弧形就可以,但是这个代码是4个都有。
希望您可以再次check一哈
好像还真是这样~我找找以前的代码吧~
呵呵,是的吧
您弄好了,可以发到我邮箱一份吗
已经把源码上传了,你可以下载了~
弧形的颜色怎么弄得和线条的颜色不一样呢