• 一个C#控件开发的实例


    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;
            }

        }
    }

  • 相关阅读:
    违反并发性: UpdateCommand 影响了预期1条记录中的0条——我的解决方案
    (转)使用DataGridView控件常见问题解答
    C#中如何去除数组中重复的项
    C#中如何去除HTML标记
    (转)中断基本概念
    JavaScript 操作 Cookie
    要有梦想创造卓越的职业生涯
    《暗时间》读书笔记与读后感
    前端攻略系列
    前端攻略系列(一) 前端各种优化(保证持续更新)
  • 原文地址:https://www.cnblogs.com/zhangpengshou/p/1699861.html
Copyright © 2020-2023  润新知