WinFrom自定义控件–Panel扩展

2011-01-06 17:01:12 作者: 所属分类:WinForm编程 阅读:1155 评论:9

标签:

一、自定义控件介绍

在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工具栏图标

具体实现代码如下:

Code
  1. [ToolboxBitmap(typeof(Panel))]   
  2.     public class PanelEx:Panel   
  3.     {   
  4.         private Color _borderColor = Color.FromArgb(23, 169, 254);   
  5.         private int _radius = 10;   
  6.         private RoundStyle _roundeStyle;   
  7.   
  8.         private const int WM_ERASEBKGND = 0x0014;   
  9.         private const int WM_PAINT = 0xF;   
  10.   
  11.         public PanelEx()   
  12.             : base()   
  13.         {   
  14.         }   
  15.   
  16.         [DefaultValue(typeof(Color), "23, 169, 254"), Description("控件边框颜色")]   
  17.         public Color BorderColor   
  18.         {   
  19.             get { return _borderColor; }   
  20.             set    
  21.             {    
  22.                 _borderColor = value;   
  23.                 base.Invalidate();   
  24.             }   
  25.         }   
  26.   
  27.         [DefaultValue(typeof(int), "10"), Description("圆角弧度大小")]   
  28.         public int Radius   
  29.         {   
  30.             get { return _radius; }   
  31.             set  
  32.             {   
  33.                 _radius = value;   
  34.                 base.Invalidate();   
  35.             }   
  36.         }   
  37.   
  38.         protected override void WndProc(ref Message m)   
  39.         {   
  40.             try  
  41.             {   
  42.                 base.WndProc(ref m);   
  43.                 if (m.Msg == WM_PAINT)   
  44.                 {   
  45.                     if (this.Radius > 0)   
  46.                     {   
  47.                         using (Graphics g = Graphics.FromHwnd(this.Handle))   
  48.                         {   
  49.                             Rectangle r = new Rectangle();   
  50.                             r.Width = this.Width;   
  51.                             r.Height = this.Height;   
  52.                             DrawBorder(g,r,this.Radius);   
  53.                         }   
  54.                     }   
  55.                 }   
  56.             }   
  57.             catch(Exception ex)   
  58.             {   
  59.                 MessageBox.Show(ex.Message);   
  60.             }   
  61.         }   
  62.   
  63.         private void DrawBorder(Graphics g, Rectangle rect, int radius)   
  64.         {   
  65.             rect.Width -= 1;   
  66.             rect.Height -= 1;   
  67.   
  68.             GraphicsPath path = new GraphicsPath();   
  69.   
  70.             path.AddArc(rect.X, rect.Y, radius, radius, 180, 90);   
  71.             path.AddArc(rect.Right - radius , rect.Y, radius, radius, 270, 90);   
  72.             path.AddArc(rect.Right - radius , rect.Bottom - radius , radius, radius, 0, 90);   
  73.             path.AddArc(rect.X, rect.Bottom - radius , radius, radius, 90, 90);   
  74.   
  75.             using (Pen pen = new Pen(this.BorderColor))   
  76.             {   
  77.                 g.DrawPath(pen, path);   
  78.             }   
  79.         }   
  80.     }  

编码完成后,控件效果如下:

1、在VS中控件属性框中,会出现所添加的两个属性项,如图所示:

panel.jpg

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

panelEx.jpg

控件已经是有圆角的弧度,并且控件边框也是变成了自行设定的颜色。

三、关联知识补遗

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伯伯共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。

【下一篇】

目前有 9 条留言 其中:访客:5 条, 博主:4 条

  1. 简单 CHINA Internet Explorer Windows : 2012年03月29日09:27:29 板凳 @回复 回复

    嗯,谢谢,
    就是我想要的效果,万分感谢哦 :razz:

  2. 简单 CHINA Internet Explorer Windows : 2012年03月28日17:09:41 沙发 @回复 回复

    这个代码复制到程序上有问题啊 ,
    能否把你图上显示的代码(解决方案)发到我邮箱去,
    万分感激,希望能发送

    • 头像 IT伯伯 CHINA Mozilla Firefox Windows : 2012年03月29日08:59:44 @回复 回复

      这个就是完整的代码啊~图片上那4个框是这个控件的,窗体皮肤是另外的~

      • 简单 CHINA Internet Explorer Windows : 2012年03月29日09:03:35 @回复 回复

        不是的,我已经实验了,复制这个代码,左边没有边框。
        而且我只要上面两个角有弧形就可以,但是这个代码是4个都有。
        希望您可以再次check一哈

        • 头像 IT伯伯 CHINA Mozilla Firefox Windows : 2012年03月29日09:08:22 @回复 回复

          好像还真是这样~我找找以前的代码吧~

          • 简单 CHINA Internet Explorer Windows : 2012年03月29日09:10:04 @回复 回复

            呵呵,是的吧

            您弄好了,可以发到我邮箱一份吗

            • 头像 IT伯伯 CHINA Mozilla Firefox Windows : 2012年03月29日09:18:09 @回复 回复

              已经把源码上传了,你可以下载了~

              • 简单 CHINA Internet Explorer Windows : 2012年03月29日11:00:23 @回复 回复

                弧形的颜色怎么弄得和线条的颜色不一样呢

给我留言


页面载入中..

展开