c#自定义控件开发实例(1)

类别:.NET开发 点击:0 评论:0 推荐:

源文件:http://ded.nuaa.edu.cn/download/Windows%20Extended%20Controls.rar
示例代码:http://ded.nuaa.edu.cn/download/WindowsApplication6.rar

最近做一个图象的采集,需要一个图形的选择控件,但是在.net下没有类似vb中的shape控件,所以考虑了自己写一个控件。

下面我将从头创建控件,这个控件主要是用来选择图形的Rectangle,有一下几个属性Color BorderColor:边框颜色,Color BackColor:背景颜色,bool ReSizeble:是否可移动, Rectangle SelectRectangle:选择区域。
打开vs2003(我用的这个版本),新建一个c#控件库,ok,拷贝如下代码到你的代码里。

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace WindowsExtendedControls
{
 /// <summary>
 /// 控件
 /// </summary>
 public class ShapeEx : System.Windows.Forms.Control
 {
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  ///
  private Color _BorderColor=new Color();
  private Color _BackColor=new Color();
  private bool _ReSizeble;
  private Point _SelfLocation=new Point();
  private Point _MouseLocation=new Point();
  private int _SelfWidth;
  private int _SelfHeight;
  private int _SelectSelctedIndex;//0-8,0:SizeAll
  private Rectangle _rectLeftSelector=new Rectangle();
  private Rectangle _rectTopSelector=new Rectangle();
  private Rectangle _rectRightSelector=new Rectangle();
  private Rectangle _rectBottomSelector=new Rectangle();
  private Rectangle _rectLeftTopSelector=new Rectangle();
  private Rectangle _rectRightTopSelector=new Rectangle();
  private Rectangle _rectRightBottomSelector=new Rectangle();
  private Rectangle _rectLeftBottomSelector=new Rectangle();
  private System.ComponentModel.Container components = null;
  public ShapeEx()
  {
   // 该调用是 Windows.Forms 窗体设计器所必需的。
   InitializeComponent();

   // TODO: 在 InitComponent 调用后添加任何初始化

  }
  [DefaultValue("Black"),Description("边框颜色"),Category("Appearance")]
  public Color BorderColor
  {
   get
   {
    // Insert code here.
    return _BorderColor;
   }
   set
   {
    _BorderColor=value;
    this.Invalidate();
   }
  }
  [DefaultValue("Control"),Description("背景颜色"),Category("Appearance")]
  public override Color BackColor
  {
   get
   {
    // Insert code here.
    return _BackColor;
   }
   set
   {
    _BackColor=value;
    this.Invalidate();
   }
  }
  [DefaultValue(false),Description("运行中控件大小是否可拖拽编辑"),Category("Behavior")]
  public  bool ReSizeble
  {
   get
   {
    // Insert code here.
    return _ReSizeble;
   }
   set
   {
    _ReSizeble=value;
    this.Invalidate();
   }
  }
  [Description("控件选择区域"),Category("Behavior")]
  public  Rectangle SelectRectangle
  {
   get
   {
    Rectangle selectRectangler=new Rectangle();
    selectRectangler.X = this.Location.X+7;
    selectRectangler.Y = this.Location.Y+7;
    selectRectangler.Height = this.Height-15;
    selectRectangler.Width = this.Width-15;
    return selectRectangler;
   }
  
  }
 
  protected override void OnPaint(PaintEventArgs pe)
  {
   // Calling the base class OnPaint
   base.OnPaint(pe);
   ReDrawControl(pe.Graphics);
  }
  private void DrawSelector(Graphics graphics)
  {
   SolidBrush SelectorPen=new SolidBrush(Color.White);
   Pen borderPen=new Pen(this._BorderColor,1);
   try
   {
    //实心

    PointF[] LeftPoints=getPointF(0,this.Height/2-3,6,6);
    graphics.FillClosedCurve(SelectorPen, LeftPoints);

    PointF[] TopPoints=getPointF(this.Width/2-3,0,6,6);
    graphics.FillClosedCurve(SelectorPen, TopPoints);

    PointF[] RightPoints=getPointF(this.Width-7,this.Height/2-3,6,6);
    graphics.FillClosedCurve(SelectorPen, RightPoints);

    PointF[] BottomPoints=getPointF(this.Width/2-3,this.Height-7,6,6);
    graphics.FillClosedCurve(SelectorPen, BottomPoints);

    PointF[] LeftTopPoints=getPointF(0,0,6,6);
    graphics.FillClosedCurve(SelectorPen, LeftTopPoints);

    PointF[] RightTopPoints=getPointF(this.Width-7,0,6,6);
    graphics.FillClosedCurve(SelectorPen, RightTopPoints);

    PointF[] RightBottomPoints=getPointF(this.Width-7,this.Height-7,6,6);
    graphics.FillClosedCurve(SelectorPen, RightBottomPoints);
    
    PointF[] LeftBottomPoints=getPointF(0,this.Height-7,6,6);
    graphics.FillClosedCurve(SelectorPen, LeftBottomPoints);
    //边框
    _rectLeftSelector.X = 0;
    _rectLeftSelector.Y = this.Height/2-3;
    _rectLeftSelector.Height = 6;
    _rectLeftSelector.Width = 6;
    graphics.DrawRectangle(borderPen, _rectLeftSelector);

    _rectTopSelector.X = this.Width/2-3;
    _rectTopSelector.Y = 0;
    _rectTopSelector.Height = 6;
    _rectTopSelector.Width = 6;
    graphics.DrawRectangle(borderPen, _rectTopSelector);

    _rectRightSelector.X = this.Width-7;
    _rectRightSelector.Y = this.Height/2-3;
    _rectRightSelector.Height = 6;
    _rectRightSelector.Width = 6;
    graphics.DrawRectangle(borderPen, _rectRightSelector);

    _rectBottomSelector.X = this.Width/2-3;
    _rectBottomSelector.Y = this.Height-7;
    _rectBottomSelector.Height = 6;
    _rectBottomSelector.Width = 6;
    graphics.DrawRectangle(borderPen, _rectBottomSelector);

    _rectLeftTopSelector.X=0;
    _rectLeftTopSelector.Y=0;
    _rectLeftTopSelector.Width=6;
    _rectLeftTopSelector.Height=6;
    graphics.DrawRectangle(borderPen, _rectLeftTopSelector);

    _rectRightTopSelector.X=this.Width-7;
    _rectRightTopSelector.Y=0;
    _rectRightTopSelector.Width=6;
    _rectRightTopSelector.Height=6;
    graphics.DrawRectangle(borderPen, _rectRightTopSelector);

    _rectRightBottomSelector.X=this.Width-7;
    _rectRightBottomSelector.Y=this.Height-7;
    _rectRightBottomSelector.Width=6;
    _rectRightBottomSelector.Height=6;
    graphics.DrawRectangle(borderPen, _rectRightBottomSelector);

    _rectLeftBottomSelector.X=0;
    _rectLeftBottomSelector.Y=this.Height-7;
    _rectLeftBottomSelector.Width=6;
    _rectLeftBottomSelector.Height=6;
    graphics.DrawRectangle(borderPen, _rectLeftBottomSelector);
   }
   catch(Exception E)
   {
    throw E;
   }
   finally
   {
    SelectorPen.Dispose();
    borderPen.Dispose();
   }
    
  }
  private void ReDrawControl(Graphics graphics)
  {
   
   try
   {
   
    //绘制背景
    /*
    graphics.Clear(this._BackColor);
    SolidBrush backPen=new SolidBrush(this._BackColor);
    PointF point1 = new PointF(1,1);
    PointF point2 = new PointF(this.Width-2,1);
    PointF point3 = new PointF(this.Width-2,this.Height-2);
    PointF point4 = new PointF(1,this.Height-2);
    PointF[] points = {point1, point2, point3, point4};
    graphics.FillClosedCurve(backPen, points);
    */
    //绘制边框    
    Rectangle rectBorder=new Rectangle();
    Pen borderPen=new Pen(this._BorderColor,1);
    rectBorder.X = 7;
    rectBorder.Y = 7;
    rectBorder.Height = this.Height-15;
    rectBorder.Width = this.Width-15;
    graphics.DrawRectangle(borderPen, rectBorder);
    //绘制编辑框
    if (_ReSizeble)
    {
     DrawSelector(graphics);
    }
   }
   catch(Exception E)
   {
    throw E;
   }
   finally
   {
    graphics.Dispose();
   }
  }
  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  private PointF[] getPointF(int x,int y,int Width,int Height){
   PointF point1 = new PointF(x,y);
   PointF point2 = new PointF(x+Width,y);
   PointF point3 = new PointF(x+Width,y+Height);
   PointF point4 = new PointF(x,y+Height);
   PointF[] points = {point1, point2, point3, point4};
   return points;
  }
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if( components != null )
     components.Dispose();
   }
   base.Dispose( disposing );
  }

  #region 组件设计器生成的代码
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器
  /// 修改此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
   components = new System.ComponentModel.Container();
   this.Resize+=new EventHandler(ShapeEx_Resize);
   this.MouseDown+=new MouseEventHandler(ShapeEx_MouseDown);
   this.MouseMove+=new MouseEventHandler(ShapeEx_MouseMove);
   this.MouseLeave+=new EventHandler(ShapeEx_MouseLeave);
   this.MouseUp+=new MouseEventHandler(ShapeEx_MouseUp);

   this._BorderColor=Color.Black;
   this._BackColor=Color.FromName("Control");
   this._ReSizeble=false;
   this._SelectSelctedIndex=-1;
   SetStyle(ControlStyles.SupportsTransparentBackColor, true);
  }
  #endregion

  private void ShapeEx_Resize(object sender, EventArgs e)
  {
   if (this.Width<16 || this.Height<16)
   {
    this.Width=16;
    this.Height=16;
   }
   this.Invalidate();
  }

 

  private void ShapeEx_MouseDown(object sender, MouseEventArgs e)
  {
   if (_ReSizeble)
   {
    if (_rectLeftSelector.Contains(e.X,e.Y) || _rectRightSelector.Contains(e.X,e.Y) || _rectTopSelector.Contains(e.X,e.Y) || _rectBottomSelector.Contains(e.X,e.Y) ||_rectLeftTopSelector.Contains(e.X,e.Y) || _rectRightTopSelector.Contains(e.X,e.Y) || _rectRightBottomSelector.Contains(e.X,e.Y) || _rectLeftBottomSelector.Contains(e.X,e.Y))
    {
     if (_rectLeftTopSelector.Contains(e.X,e.Y) )
     {
      this.Cursor=Cursors.SizeNWSE;
      this._SelectSelctedIndex=1;
     }
     
     if (_rectTopSelector.Contains(e.X,e.Y) )
     {
      this.Cursor=Cursors.SizeNS;
      this._SelectSelctedIndex=2;
     }
     if (_rectRightTopSelector.Contains(e.X,e.Y) )
     {
      this.Cursor=Cursors.SizeNESW;
      this._SelectSelctedIndex=3;
     }
     if (_rectRightSelector.Contains(e.X,e.Y) )
     {
      this.Cursor=Cursors.SizeWE;
      this._SelectSelctedIndex=4;
     }
     if (_rectRightBottomSelector.Contains(e.X,e.Y) )
     {
      this.Cursor=Cursors.SizeNWSE;
      this._SelectSelctedIndex=5;
     }
     if (_rectBottomSelector.Contains(e.X,e.Y))
     {
      this.Cursor=Cursors.SizeNS;
      this._SelectSelctedIndex=6;
     }
     if (_rectLeftBottomSelector.Contains(e.X,e.Y) )
     {
      this.Cursor=Cursors.SizeNESW;
      this._SelectSelctedIndex=7;
     }
     if (_rectLeftSelector.Contains(e.X,e.Y))
     {
      this.Cursor=Cursors.SizeWE;
      this._SelectSelctedIndex=8;
     }

    }
    else
    {
     this.Cursor=Cursors.SizeAll;
     this._SelectSelctedIndex=0;
    }
    this._SelfLocation.X=this.Location.X;
    this._SelfLocation.Y=this.Location.Y;
    this._MouseLocation.X=Cursor.Position.X;
    this._MouseLocation.Y=Cursor.Position.Y;
    this._SelfWidth=this.Width;
    this._SelfHeight=this.Height;
   }
  }

  private void ShapeEx_MouseMove(object sender, MouseEventArgs e)
  {
   //move and resize
   switch (this._SelectSelctedIndex)
   {
    case 0:
     this.Location=new Point(Cursor.Position.X-(_MouseLocation.X-_SelfLocation.X),Cursor.Position.Y-(_MouseLocation.Y-_SelfLocation.Y));
     break;
    case 1:
     this.Height=this._SelfHeight-(Cursor.Position.Y-_MouseLocation.Y);
     this.Width=this._SelfWidth-(Cursor.Position.X-_MouseLocation.X);
     this.Location=new Point(Cursor.Position.X-_MouseLocation.X+_SelfLocation.X,Cursor.Position.Y-_MouseLocation.Y+_SelfLocation.Y);
     break;
    case 2:
     this.Height=this._SelfHeight-(Cursor.Position.Y-_MouseLocation.Y);
     this.Location=new Point(_SelfLocation.X,Cursor.Position.Y-_MouseLocation.Y+_SelfLocation.Y);
     break;
    case 3:
     this.Height=this._SelfHeight-(Cursor.Position.Y-_MouseLocation.Y);
     this.Width=this._SelfWidth+(Cursor.Position.X-_MouseLocation.X);
     this.Location=new Point(_SelfLocation.X,Cursor.Position.Y-(_MouseLocation.Y-_SelfLocation.Y));
     break;
    case 4:
     this.Width=this._SelfWidth+(Cursor.Position.X-_MouseLocation.X);
     break;
    case 5:
     this.Height=this._SelfHeight+(Cursor.Position.Y-_MouseLocation.Y);
     this.Width=this._SelfWidth+(Cursor.Position.X-_MouseLocation.X);
     break;
    case 6:
     this.Height=this._SelfHeight+(Cursor.Position.Y-_MouseLocation.Y);
     break;
    case 7:
     this.Height=this._SelfHeight+(Cursor.Position.Y-_MouseLocation.Y);
     this.Width=this._SelfWidth-(Cursor.Position.X-_MouseLocation.X);
     this.Location=new Point(Cursor.Position.X-_MouseLocation.X+_SelfLocation.X,_SelfLocation.Y);
     break;
    case 8:
     this.Width=this._SelfWidth-(Cursor.Position.X-_MouseLocation.X);
     this.Location=new Point(Cursor.Position.X-_MouseLocation.X+_SelfLocation.X,_SelfLocation.Y);
     break;
   }

  }

  private void ShapeEx_MouseLeave(object sender, EventArgs e)
  {
   this.Cursor=Cursors.Default;
   this._SelectSelctedIndex=-1;
  }

  private void ShapeEx_MouseUp(object sender, MouseEventArgs e)
  {
   this.Cursor=Cursors.Default;
   this._SelectSelctedIndex=-1;
  }

 }
}

本文地址:http://com.8s8s.com/it/it44728.htm