C# WinForm自定义控件开发实例最近做一个图象的采集,需要一个图形的选择控件,但是在.net下没有类似vb中的shape控件,所以考虑了自己写一个控件。
下面我将从头创建控件,这个控件主要是用来选择图形的Rectangle,有一下几个属性Color BorderColor:边框颜色,Color BackColor:背景颜色,bool ReSizeble:是否可移动,Rectangle SelectRectangle:选择区域。
打开vs2003(我用的这个版本),新建一个c#控件库,ok,拷贝如下代码到你的代码里。
using System;using System.Collections;using ponentModel;using System.Drawing;using System.Data;usingSystem.Windows.Forms;namespace WindowsExtendedControls{ /// /// 控件/// public class ShapeEx : System.Windows.Forms.Control { /// /// 必需的设计器变量。
/// /// 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 ponentModel.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); SolidBrushbackPen=new SolidBrush(this._BackColor); PointFpoint1 = new PointF(1,1); PointF point2 = newPointF(this.Width-2,1); PointF point3 = newPointF(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(); } } /// /// 清理所有正在使用的资源。