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