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

来源:互联网 发布:design center 软件 编辑:程序博客网 时间:2024/06/05 00:44
               using System;  
  1. using System.Collections.Generic;  
  2. using System.Text;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Windows.Forms;  
  7.   
  8. namespace AllTest  
  9. {  
  10.     class BarcodeControl  
  11.     {  
  12.         #region private  
  13.   
  14.         private const int MIN_SIZE = 10; //对控件缩放的最小值   
  15.         private const int BOX_SIZE = 7;  //调整大小触模柄方框大小   
  16.   
  17.         public bool _IsCtrlKey = false;  
  18.         private TextBox _textbox;  
  19.         private Control _MControl = null;  
  20.         private bool _IsMouseDown = false;  
  21.         private Point _oPointClicked;  
  22.         private Color BOX_COLOR = Color.White;  
  23.         private Label[] _lbl = new Label[8];  
  24.         private int _startl, _startt, _startw, _starth;  
  25.         private bool _dragging;  
  26.         private Cursor[] _arrArrow = new Cursor[] {Cursors.SizeNWSE, Cursors.SizeNS,   
  27.                                                     Cursors.SizeNESW, Cursors.SizeWE, Cursors.SizeNWSE, Cursors.SizeNS,   
  28.                                                     Cursors.SizeNESW, Cursors.SizeWE};  
  29.  
  30.         #endregion  
  31.  
  32.         #region 构造函数  
  33.   
  34.         /// <summary>   
  35.         /// 构造控件拖动对象   
  36.         /// </summary>   
  37.         /// <param name="moveControl">需要拖动的控件 </param>   
  38.         public BarcodeControl(Control moveControl)  
  39.         {  
  40.             //   
  41.             // TODO: 在此处添加构造函数逻辑   
  42.             //   
  43.             _MControl = moveControl;  
  44.             _MControl.MouseDown += new MouseEventHandler(this.Control_MouseDown);  
  45.             _MControl.MouseUp += new MouseEventHandler(this.Control_MouseUp);  
  46.             _MControl.MouseMove += new MouseEventHandler(this.Control_MouseMove);  
  47.             _MControl.Click += new System.EventHandler(this.Control_Click);  
  48.   
  49.             //构造8个调整大小触模柄   
  50.             for (int i = 0; i < 8; i++)  
  51.             {  
  52.                 _lbl[i] = new Label();  
  53.                 _lbl[i].TabIndex = i;  
  54.                 _lbl[i].FlatStyle = 0;  
  55.                 _lbl[i].BorderStyle = BorderStyle.FixedSingle;  
  56.                 _lbl[i].BackColor = BOX_COLOR;  
  57.                 _lbl[i].Cursor = _arrArrow[i];  
  58.                 _lbl[i].Text = "";  
  59.                 _lbl[i].BringToFront();  
  60.                 _lbl[i].MouseDown += new MouseEventHandler(this.handle_MouseDown);  
  61.                 _lbl[i].MouseMove += new MouseEventHandler(this.handle_MouseMove);  
  62.                 _lbl[i].MouseUp += new MouseEventHandler(this.handle_MouseUp);  
  63.             }  
  64.   
  65.             CreateTextBox();  
  66.             Create();  
  67.   
  68.             //Control_Click((object)sender, (System.EventArgs)e);   
  69.         }  
  70.  
  71.         #endregion  
  72.  
  73.         #region 需拖动控件键盘事件  
  74.   
  75.         private void textBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)  
  76.         {  
  77.             if (e.KeyValue == 37 || e.KeyValue == 38 || e.KeyValue == 39 || e.KeyValue == 40)  
  78.             {  
  79.                 if (e.KeyValue == 37)  
  80.                     _MControl.Left -= 1;  
  81.                 if (e.KeyValue == 38)  
  82.                     _MControl.Top -= 1;  
  83.                 if (e.KeyValue == 39)  
  84.                     _MControl.Left += 1;  
  85.                 if (e.KeyValue == 40)  
  86.                     _MControl.Top += 1;  
  87.                 MoveHandles();  
  88.                 ControlLocality();  
  89.                 _MControl.Visible = true;  
  90.             }  
  91.   
  92.             if (e.KeyValue == 46)  
  93.             {  
  94.                 for (int i = 0; i < 8; i++)  
  95.                 {  
  96.                     _MControl.Parent.Controls.Remove(_lbl[i]);  
  97.                 }  
  98.                 _MControl.Parent.Controls.Remove(_MControl);  
  99.                 _textbox.Parent.Controls.Remove(_textbox);  
  100.             }  
  101.   
  102.             if (e.KeyValue == 17)  
  103.             {  
  104.                 _IsCtrlKey = true;  
  105.                 //MessageBox.Show("a");   
  106.             }  
  107.         }  
  108.  
  109.         #endregion  
  110.  
  111.         #region 需拖动控件鼠标事件  
  112.   
  113.         private void Control_Click(object sender, System.EventArgs e)  
  114.         {  
  115.             _textbox.Focus();  
  116.             _MControl = (sender as Control);  
  117.             MoveHandles();  
  118.   
  119.             if (_IsCtrlKey == false)  
  120.             {  
  121.                 for (int i = 0; i < _MControl.Parent.Controls.Count; i++)  
  122.                 {  
  123.                     if (_MControl.Parent.Controls[i].Text.Trim().Length == 0 && _MControl.Parent.Controls[i] is Label)  
  124.                     {  
  125.                         _MControl.Parent.Controls[i].Visible = false;  
  126.                     }  
  127.                 }  
  128.             }  
  129.         }  
  130.         private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)  
  131.         {  
  132.             _IsMouseDown = true;  
  133.             _oPointClicked = new Point(e.X, e.Y);  
  134.             for (int i = 0; i < 8; i++)  
  135.             {  
  136.                 _MControl.Parent.Controls.Add(_lbl[i]);  
  137.                 _lbl[i].BringToFront();  
  138.             }  
  139.             HideHandles();  
  140.         }  
  141.   
  142.         private void Control_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)  
  143.         {  
  144.             _IsMouseDown = false;  
  145.             MoveHandles();  
  146.             ShowHandles();  
  147.             _MControl.Visible = true;  
  148.         }  
  149.   
  150.         private void Control_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)  
  151.         {  
  152.             if (_IsMouseDown)  
  153.             {  
  154.                 int l = _MControl.Left + (e.X - _oPointClicked.X);  
  155.                 int t = _MControl.Top + (e.Y - _oPointClicked.Y);  
  156.                 int w = _MControl.Width;  
  157.                 int h = _MControl.Height;  
  158.                 l = (l < 0) ? 0 : ((l + w > _MControl.Parent.ClientRectangle.Width) ?  
  159.                     _MControl.Parent.ClientRectangle.Width - w : l);  
  160.                 t = (t < 0) ? 0 : ((t + h > _MControl.Parent.ClientRectangle.Height) ?  
  161.                     _MControl.Parent.ClientRectangle.Height - h : t);  
  162.                 _MControl.Left = l;  
  163.                 _MControl.Top = t;  
  164.                 ControlLocality();  
  165.             }  
  166.             //_MControl.Cursor=Cursors.SizeAll;   
  167.         }  
  168.  
  169.         #endregion  
  170.         #region 调整大小触模柄鼠标事件  
  171.   
  172.         private void handle_MouseDown(object sender, MouseEventArgs e)  
  173.         {  
  174.             _dragging = true;  
  175.             _startl = _MControl.Left;  
  176.             _startt = _MControl.Top;  
  177.             _startw = _MControl.Width;  
  178.             _starth = _MControl.Height;  
  179.             HideHandles();  
  180.         }  
  181.         // 通过触模柄调整控件大小   
  182.         //    0  1  2   
  183.         //  7      3   
  184.         //  6  5  4   
  185.         private void handle_MouseMove(object sender, MouseEventArgs e)  
  186.         {  
  187.             int l = _MControl.Left;  
  188.             int w = _MControl.Width;  
  189.             int t = _MControl.Top;  
  190.             int h = _MControl.Height;  
  191.             if (_dragging)  
  192.             {  
  193.                 switch (((Label)sender).TabIndex)  
  194.                 {  
  195.                     //l算法:控件左边X坐标 + 鼠标在触模柄X坐标 < 控件左边X坐标 + 父控件宽度 - 控件大小 ?控件左边X坐标 + 鼠标在触模柄X坐标 :控件左边X坐标 + 父控件宽度 - 控件大小    
  196.                     //t算法:   
  197.                     //w算法:   
  198.                     //h算法:   
  199.                     case 0: // _dragging top-left sizing box   
  200.                         l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE;  
  201.                         t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE;  
  202.                         w = _startl + _startw - _MControl.Left;  
  203.                         h = _startt + _starth - _MControl.Top;  
  204.                         break;  
  205.                     case 1: // _dragging top-center sizing box   
  206.                         t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE;  
  207.                         h = _startt + _starth - _MControl.Top;  
  208.                         break;  
  209.                     case 2: // _dragging top-right sizing box   
  210.                         w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE;  
  211.                         t = _startt + e.Y < _startt + _starth - MIN_SIZE ? _startt + e.Y : _startt + _starth - MIN_SIZE;  
  212.                         h = _startt + _starth - _MControl.Top;  
  213.                         break;  
  214.                     case 3: // _dragging right-middle sizing box   
  215.                         w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE;  
  216.                         break;  
  217.                     case 4: // _dragging right-bottom sizing box   
  218.                         w = _startw + e.X > MIN_SIZE ? _startw + e.X : MIN_SIZE;  
  219.                         h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE;  
  220.                         break;  
  221.                     case 5: // _dragging center-bottom sizing box   
  222.                         h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE;  
  223.                         break;  
  224.                     case 6: // _dragging left-bottom sizing box   
  225.                         l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE;  
  226.                         w = _startl + _startw - _MControl.Left;  
  227.                         h = _starth + e.Y > MIN_SIZE ? _starth + e.Y : MIN_SIZE;  
  228.                         break;  
  229.                     case 7: // _dragging left-middle sizing box   
  230.                         l = _startl + e.X < _startl + _startw - MIN_SIZE ? _startl + e.X : _startl + _startw - MIN_SIZE;  
  231.                         w = _startl + _startw - _MControl.Left;  
  232.                         break;  
  233.                 }  
  234.                 l = (l < 0) ? 0 : l;  
  235.                 t = (t < 0) ? 0 : t;  
  236.                 _MControl.SetBounds(l, t, w, h);  
  237.             }  
  238.         }  
  239.   
  240.         private void handle_MouseUp(object sender, MouseEventArgs e)  
  241.         {  
  242.             _dragging = false;  
  243.             MoveHandles();  
  244.             ShowHandles();  
  245.         }  
  246.  
  247.         #endregion  
  248.  
  249.         #region private方法  
  250.   
  251.         private void Create()  
  252.         {  
  253.             //_IsMouseDown = true;   
  254.             //_oPointClicked = new Point(e.X,e.Y);   
  255.             for (int i = 0; i < 8; i++)  
  256.             {  
  257.                 _MControl.Parent.Controls.Add(_lbl[i]);  
  258.                 _lbl[i].BringToFront();  
  259.             }  
  260.             HideHandles();  
  261.         }  
  262.   
  263.         private void CreateTextBox()  
  264.         {  
  265.             _textbox = new TextBox();  
  266.             _textbox.CreateControl();  
  267.             _textbox.Parent = _MControl.Parent;  
  268.             _textbox.Width = 0;  
  269.             _textbox.Height = 0;  
  270.             _textbox.TabStop = true;  
  271.             _textbox.KeyDown += new System.Windows.Forms.KeyEventHandler(textBox_KeyDown);  
  272.         }  
  273.   
  274.         private void ControlLocality()  
  275.         {  
  276.             if (_MControl.Location.X < 0)  
  277.             {  
  278.                 _MControl.Visible = false;  
  279.                 _MControl.Left = 0;  
  280.             }  
  281.             if (_MControl.Location.Y < 0)  
  282.             {  
  283.                 _MControl.Visible = false;  
  284.                 _MControl.Top = 0;  
  285.             }  
  286.             if (_MControl.Location.X + _MControl.Width > _MControl.Parent.Width)  
  287.             {  
  288.                 _MControl.Visible = false;  
  289.                 _MControl.Left = _MControl.Parent.Width - _MControl.Width;  
  290.             }  
  291.             if (_MControl.Location.Y + _MControl.Height > _MControl.Parent.Height)  
  292.             {  
  293.                 _MControl.Visible = false;  
  294.                 _MControl.Top = _MControl.Parent.Height - _MControl.Height;  
  295.             }  
  296.         }  
  297.   
  298.         private void HideHandles()  
  299.         {  
  300.             for (int i = 0; i < 8; i++)  
  301.             {  
  302.                 _lbl[i].Visible = false;  
  303.             }  
  304.         }  
  305.   
  306.         private void MoveHandles()  
  307.         {  
  308.             int sX = _MControl.Left - BOX_SIZE;  
  309.             int sY = _MControl.Top - BOX_SIZE;  
  310.             int sW = _MControl.Width + BOX_SIZE;  
  311.             int sH = _MControl.Height + BOX_SIZE;  
  312.             int hB = BOX_SIZE / 2;  
  313.             int[] arrPosX = new int[] {sX+hB, sX + sW / 2, sX + sW-hB, sX + sW-hB,   
  314.                                           sX + sW-hB, sX + sW / 2, sX+hB, sX+hB};  
  315.             int[] arrPosY = new int[] {sY+hB, sY+hB, sY+hB, sY + sH / 2, sY + sH-hB,   
  316.                                           sY + sH-hB, sY + sH-hB, sY + sH / 2};  
  317.             for (int i = 0; i < 8; i++)  
  318.             {  
  319.                 _lbl[i].SetBounds(arrPosX[i], arrPosY[i], BOX_SIZE, BOX_SIZE);  
  320.             }  
  321.         }  
  322.   
  323.         private void ShowHandles()  
  324.         {  
  325.             if (_MControl != null)  
  326.             {  
  327.                 for (int i = 0; i < 8; i++)  
  328.                 {  
  329.                     _lbl[i].Visible = true;  
  330.                 }  
  331.             }  
  332.         }  
  333.  
  334.         #endregion   
  335.     }  
  336. }  
0 0