您的位置:首页 > 编程语言 > C#

一个可以用鼠标改变控件位置和大小的类

2016-06-30 16:07 591 查看
               using System;  

using System.Collections.Generic;  

using System.Text;  

using System.ComponentModel;  

using System.Data;  

using System.Drawing;  

using System.Windows.Forms;  

  

namespace AllTest  

{  

    class BarcodeControl  

    {  

        #region private  

  

        private const int MIN_SIZE = 10; //对控件缩放的最小值   

        private const int BOX_SIZE = 7;  //调整大小触模柄方框大小   

  

        public bool _IsCtrlKey = false;  

        private TextBox _textbox;  

        private Control _MControl = null;  

        private bool _IsMouseDown = false;  

        private Point _oPointClicked;  

        private Color BOX_COLOR = Color.White;  

        private Label[] _lbl = new Label[8];  

        private int _startl, _startt, _startw, _starth;  

        private bool _dragging;  

        private Cursor[] _arrArrow = new Cursor[] {Cursors.SizeNWSE, Cursors.SizeNS,   

                                                    Cursors.SizeNESW, Cursors.SizeWE, Cursors.SizeNWSE, Cursors.SizeNS,   

                                                    Cursors.SizeNESW, Cursors.SizeWE};  

 

        #endregion  

 

        #region 构造函数  

  

        /// <summary>   

        /// 构造控件拖动对象   

        /// </summary>   

        /// <param name="moveControl">需要拖动的控件 </param>   

        public BarcodeControl(Control moveControl)  

        {  

            //   

            // TODO: 在此处添加构造函数逻辑   

            //   

            _MControl = moveControl;  

            _MControl.MouseDown += new MouseEventHandler(this.Control_MouseDown);  

            _MControl.MouseUp += new MouseEventHandler(this.Control_MouseUp);  

            _MControl.MouseMove += new MouseEventHandler(this.Control_MouseMove);  

            _MControl.Click += new System.EventHandler(this.Control_Click);  

  

            //构造8个调整大小触模柄   

            for (int i = 0; i < 8; i++)  

            {  

                _lbl[i] = new Label();  

                _lbl[i].TabIndex = i;  

                _lbl[i].FlatStyle = 0;  

                _lbl[i].BorderStyle = BorderStyle.FixedSingle;  

                _lbl[i].BackColor = BOX_COLOR;  

                _lbl[i].Cursor = _arrArrow[i];  

                _lbl[i].Text = "";  

                _lbl[i].BringToFront();  

                _lbl[i].MouseDown += new MouseEventHandler(this.handle_MouseDown);  

                _lbl[i].MouseMove += new MouseEventHandler(this.handle_MouseMove);  

                _lbl[i].MouseUp += new MouseEventHandler(this.handle_MouseUp);  

            }  

  

            CreateTextBox();  

            Create();  

  

            //Control_Click((object)sender, (System.EventArgs)e);   

        }  

 

        #endregion  

 

        #region 需拖动控件键盘事件  

  

        private void textBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)  

        {  

            if (e.KeyValue == 37 || e.KeyValue == 38 || e.KeyValue == 39 || e.KeyValue == 40)  

            {  

                if (e.KeyValue == 37)  

                    _MControl.Left -= 1;  

                if (e.KeyValue == 38)  

                    _MControl.Top -= 1;  

                if (e.KeyValue == 39)  

                    _MControl.Left += 1;  

                if (e.KeyValue == 40)  

                    _MControl.Top += 1;  

                MoveHandles();  

                ControlLocality();  

                _MControl.Visible = true;  

            }  

  

            if (e.KeyValue == 46)  

            {  

                for (int i = 0; i < 8; i++)  

                {  

                    _MControl.Parent.Controls.Remove(_lbl[i]);  

                }  

                _MControl.Parent.Controls.Remove(_MControl);  

                _textbox.Parent.Controls.Remove(_textbox);  

            }  

  

            if (e.KeyValue == 17)  

            {  

                _IsCtrlKey = true;  

                //MessageBox.Show("a");   

            }  

        }  

 

        #endregion  

 

        #region 需拖动控件鼠标事件  

  

        private void Control_Click(object sender, System.EventArgs e)  

        {  

            _textbox.Focus();  

            _MControl = (sender as Control);  

            MoveHandles();  

  

            if (_IsCtrlKey == false)  

            {  

                for (int i = 0; i < _MControl.Parent.Controls.Count; i++)  

                {  

                    if (_MControl.Parent.Controls[i].Text.Trim().Length == 0 && _MControl.Parent.Controls[i] is Label)  

                    {  

                        _MControl.Parent.Controls[i].Visible = false;  

                    }  

                }  

            }  

        }  

        private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)  

        {  

            _IsMouseDown = true;  

            _oPointClicked = new Point(e.X, e.Y);  

            for (int i = 0; i < 8; i++)  

            {  

                _MControl.Parent.Controls.Add(_lbl[i]);  

                _lbl[i].BringToFront();  

            }  

            HideHandles();  

        }  

  

        private void Control_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)  

        {  

            _IsMouseDown = false;  

            MoveHandles();  

            ShowHandles();  

            _MControl.Visible = true;  

        }  

  

        private void Control_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)  

        {  

            if (_IsMouseDown)  

            {  

                int l = _MControl.Left + (e.X - _oPointClicked.X);  

                int t = _MControl.Top + (e.Y - _oPointClicked.Y);  

                int w = _MControl.Width;  

                int h = _MControl.Height;  

                l = (l < 0) ? 0 : ((l + w > _MControl.Parent.ClientRectangle.Width) ?  

                    _MControl.Parent.ClientRectangle.Width - w : l);  

                t = (t < 0) ? 0 : ((t + h > _MControl.Parent.ClientRectangle.Height) ?  

                    _MControl.Parent.ClientRectangle.Height - h : t);  

                _MControl.Left = l;  

                _MControl.Top = t;  

                ControlLocality();  

            }  

            //_MControl.Cursor=Cursors.SizeAll;   

        }  

 

        #endregion  

        #region 调整大小触模柄鼠标事件  

  

        private void handle_MouseDown(object sender, MouseEventArgs e)  

        {  

            _dragging = true;  

            _startl = _MControl.Left;  

            _startt = _MControl.Top;  

            _startw = _MControl.Width;  

            _starth = _MControl.Height;  

            HideHandles();  

        }  

        // 通过触模柄调整控件大小   

        //    0  1  2   

        //  7      3   

        //  6  5  4   

        private void handle_MouseMove(object sender, MouseEventArgs e)  

        {  

            int l = _MControl.Left;  

            int w = _MControl.Width;  

            int t = _MControl.Top;  

            int h = _MControl.Height;  

            if (_dragging)  

            {  

                switch (((Label)sender).TabIndex)  

                {  

                    //l算法:控件左边X坐标 + 鼠标在触模柄X坐标 < 控件左边X坐标 + 父控件宽度 - 控件大小 ?控件左边X坐标 + 鼠标在触模柄X坐标 :控件左边X坐标 + 父控件宽度 - 控件大小    

                    //t算法:   

                    //w算法:   

                    //h算法:   

                    case 0: // _dragging top-left sizing box   

                        l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE;  

                        t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE;  

                        w = _startl + _startw - _MControl.Left;  

                        h = _startt + _starth - _MControl.Top;  

                        break;  

                    case 1: // _dragging top-center sizing box   

                        t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE;  

                        h = _startt + _starth - _MControl.Top;  

                        break;  

                    case 2: // _dragging top-right sizing box   

                        w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE;  

                        t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE;  

                        h = _startt + _starth - _MControl.Top;  

                        break;  

                    case 3: // _dragging right-middle sizing box   

                        w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE;  

                        break;  

                    case 4: // _dragging right-bottom sizing box   

                        w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE;  

                        h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE;  

                        break;  

                    case 5: // _dragging center-bottom sizing box   

                        h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE;  

                        break;  

                    case 6: // _dragging left-bottom sizing box   

                        l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE;  

                        w = _startl + _startw - _MControl.Left;  

                        h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE;  

                        break;  

                    case 7: // _dragging left-middle sizing box   

                        l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE;  

                        w = _startl + _startw - _MControl.Left;  

                        break;  

                }  

                l = (l < 0) ? 0 : l;  

                t = (t < 0) ? 0 : t;  

                _MControl.SetBounds(l, t, w, h);  

            }  

        }  

  

        private void handle_MouseUp(object sender, MouseEventArgs e)  

        {  

            _dragging = false;  

            MoveHandles();  

            ShowHandles();  

        }  

 

        #endregion  

 

        #region private方法  

  

        private void Create()  

        {  

            //_IsMouseDown = true;   

            //_oPointClicked = new Point(e.X,e.Y);   

            for (int i = 0; i < 8; i++)  

            {  

                _MControl.Parent.Controls.Add(_lbl[i]);  

                _lbl[i].BringToFront();  

            }  

            HideHandles();  

        }  

  

        private void CreateTextBox()  

        {  

            _textbox = new TextBox();  

            _textbox.CreateControl();  

            _textbox.Parent = _MControl.Parent;  

            _textbox.Width = 0;  

            _textbox.Height = 0;  

            _textbox.TabStop = true;  

            _textbox.KeyDown += new System.Windows.Forms.KeyEventHandler(textBox_KeyDown);  

        }  

  

        private void ControlLocality()  

        {  

            if (_MControl.Location.X < 0)  

            {  

                _MControl.Visible = false;  

                _MControl.Left = 0;  

            }  

            if (_MControl.Location.Y < 0)  

            {  

                _MControl.Visible = false;  

                _MControl.Top = 0;  

            }  

            if (_MControl.Location.X + _MControl.Width > _MControl.Parent.Width)  

            {  

                _MControl.Visible = false;  

                _MControl.Left = _MControl.Parent.Width - _MControl.Width;  

            }  

            if (_MControl.Location.Y + _MControl.Height > _MControl.Parent.Height)  

            {  

                _MControl.Visible = false;  

                _MControl.Top = _MControl.Parent.Height - _MControl.Height;  

            }  

        }  

  

        private void HideHandles()  

        {  

            for (int i = 0; i < 8; i++)  

            {  

                _lbl[i].Visible = false;  

            }  

        }  

  

        private void MoveHandles()  

        {  

            int sX = _MControl.Left - BOX_SIZE;  

            int sY = _MControl.Top - BOX_SIZE;  

            int sW = _MControl.Width + BOX_SIZE;  

            int sH = _MControl.Height + BOX_SIZE;  

            int hB = BOX_SIZE / 2;  

            int[] arrPosX = new int[] {sX+hB, sX + sW / 2, sX + sW-hB, sX + sW-hB,   

                                          sX + sW-hB, sX + sW / 2, sX+hB, sX+hB};  

            int[] arrPosY = new int[] {sY+hB, sY+hB, sY+hB, sY + sH / 2, sY + sH-hB,   

                                          sY + sH-hB, sY + sH-hB, sY + sH / 2};  

            for (int i = 0; i < 8; i++)  

            {  

                _lbl[i].SetBounds(arrPosX[i], arrPosY[i], BOX_SIZE, BOX_SIZE);  

            }  

        }  

  

        private void ShowHandles()  

        {  

            if (_MControl != null)  

            {  

                for (int i = 0; i < 8; i++)  

                {  

                    _lbl[i].Visible = true;  

                }  

            }  

        }  

 

        #endregion   

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  鼠标 C# Winform