C# WinForm控件的拖动和缩放的实现

转自:http://blog.csdn.net/joyhen/article/details/8572505

C# WinForm控件的拖动和缩放是个很有用的功能。实现起来其实很简单的,主要是设计控件的MouseDown、MouseLeave、MouseMove事件,下面的几个步骤将逐步实现C# WinForm控件的拖动和缩放的功能。

[csharp] view plain copy
  1. 1、定义一个枚举类型,描述光标状态  
  2.   
  3. private enum EnumMousePointPosition    
  4.    {    
  5.     MouseSizeNone   = 0, //'无    
  6.     MouseSizeRight   = 1, //'拉伸右边框    
  7.     MouseSizeLeft   = 2, //'拉伸左边框    
  8.     MouseSizeBottom   = 3, //'拉伸下边框    
  9.     MouseSizeTop   = 4, //'拉伸上边框    
  10.     MouseSizeTopLeft = 5, //'拉伸左上角    
  11.     MouseSizeTopRight = 6, //'拉伸右上角    
  12.     MouseSizeBottomLeft = 7, //'拉伸左下角    
  13.     MouseSizeBottomRight= 8, //'拉伸右下角    
  14.     MouseDrag    = 9   // '鼠标拖动    
  15.    }   

[csharp] view plain copy
  1. 2、定义几个变量  
  2.   
  3. const int Band = 5;    
  4.    const int MinWidth=10;    
  5.    const int MinHeight=10;    
  6.    private EnumMousePointPosition m_MousePointPosition;    
  7.    private Point p,p1;   

[csharp] view plain copy
  1. 3、定义自己的MyMouseDown事件  
  2.   
  3. private void MyMouseDown(object sender,System.Windows.Forms.MouseEventArgs e)    
  4. {    
  5.  p.X=e.X;    
  6.  p.Y=e.Y;    
  7.  p1.X=e.X;    
  8.  p1.Y=e.Y;       
  9. }   

[csharp] view plain copy
  1. 4、定义自己的MyMouseLeave事件  
  2.   
  3. private void MyMouseLeave(object sender, System.EventArgs e)    
  4. {    
  5.  m_MousePointPosition = EnumMousePointPosition.MouseSizeNone;    
  6.  this.Cursor=Cursors.Arrow;    
  7. }   

[csharp] view plain copy
  1. 5、设计一个函数,确定光标在控件不同位置的样式  
  2.   
  3. private EnumMousePointPosition MousePointPosition(Size size,System.Windows.Forms.MouseEventArgs e)    
  4. {    
  5.    
  6.  if ((e.X >= -1 * Band) | (e.X <= size.Width) | (e.Y >= -1 * Band) | (e.Y <= size.Height))     
  7.  {    
  8.   if (e.X < Band)     
  9.   {    
  10.    if (e.Y < Band) {return EnumMousePointPosition.MouseSizeTopLeft;}    
  11.    else     
  12.    {    
  13.     if (e.Y > -1 * Band + size.Height)     
  14.     {return EnumMousePointPosition.MouseSizeBottomLeft;}    
  15.     else     
  16.     {return EnumMousePointPosition.MouseSizeLeft;}    
  17.    }    
  18.   }    
  19.   else   
  20.   {    
  21.    if (e.X > -1 * Band + size.Width)    
  22.    {    
  23.     if (e.Y < Band)    
  24.     {return EnumMousePointPosition.MouseSizeTopRight;}    
  25.     else     
  26.     {    
  27.      if (e.Y > -1 * Band + size.Height)    
  28.      {return EnumMousePointPosition.MouseSizeBottomRight;}    
  29.      else   
  30.      {return EnumMousePointPosition.MouseSizeRight;}    
  31.     }    
  32.    }    
  33.    else   
  34.    {    
  35.     if (e.Y < Band)     
  36.     {return EnumMousePointPosition.MouseSizeTop;}    
  37.     else   
  38.     {    
  39.      if (e.Y > -1 * Band + size.Height)     
  40.      {return EnumMousePointPosition.MouseSizeBottom;}    
  41.      else     
  42.      {return EnumMousePointPosition.MouseDrag;}    
  43.     }    
  44.    }    
  45.   }    
  46.  }    
  47.  else     
  48.  {return EnumMousePointPosition.MouseSizeNone;}    
  49. }   

[csharp] view plain copy
  1. 6、定义自己的MyMouseMove事件,在这个事件里,会使用上面设计的函数  
  2.   
  3.    private void MyMouseMove(object sender,System.Windows.Forms.MouseEventArgs e)    
  4.    {    
  5.     Control lCtrl =(sender as Control);    
  6.    
  7.     if (e.Button==MouseButtons.Left)    
  8.     {    
  9.      switch (m_MousePointPosition)    
  10.      {    
  11.       case EnumMousePointPosition.MouseDrag:          
  12.        lCtrl.Left =lCtrl.Left+ e.X - p.X;    
  13.        lCtrl.Top =lCtrl.Top+ e.Y - p.Y;    
  14.        break;    
  15.       case EnumMousePointPosition.MouseSizeBottom:    
  16.        lCtrl.Height = lCtrl.Height + e.Y - p1.Y;    
  17.        p1.X=e.X;    
  18.        p1.Y=e.Y; //'记录光标拖动的当前点    
  19.        break;    
  20.       case EnumMousePointPosition.MouseSizeBottomRight:    
  21.        lCtrl.Width   = lCtrl.Width + e.X - p1.X;    
  22.        lCtrl.Height = lCtrl.Height + e.Y - p1.Y;    
  23.        p1.X=e.X;    
  24.        p1.Y=e.Y; //'记录光标拖动的当前点    
  25.        break;    
  26.       case EnumMousePointPosition.MouseSizeRight:    
  27.        lCtrl.Width   = lCtrl.Width + e.X - p1.X;          
  28. //       lCtrl.Height = lCtrl.Height + e.Y - p1.Y;    
  29.        p1.X=e.X;    
  30.        p1.Y=e.Y; //'记录光标拖动的当前点    
  31.        break;    
  32.       case EnumMousePointPosition.MouseSizeTop:    
  33.        lCtrl.Top   = lCtrl.Top + (e.Y - p.Y);    
  34.        lCtrl.Height = lCtrl.Height - (e.Y - p.Y);    
  35.        break;    
  36.       case EnumMousePointPosition.MouseSizeLeft:    
  37.        lCtrl.Left   = lCtrl.Left + e.X - p.X;    
  38.        lCtrl.Width   = lCtrl.Width - (e.X - p.X);    
  39.        break;    
  40.       case EnumMousePointPosition.MouseSizeBottomLeft:    
  41.        lCtrl.Left   = lCtrl.Left + e.X - p.X;    
  42.        lCtrl.Width   = lCtrl.Width - (e.X - p.X);    
  43.        lCtrl.Height = lCtrl.Height+ e.Y - p1.Y;    
  44.        p1.X=e.X;    
  45.        p1.Y=e.Y; //'记录光标拖动的当前点    
  46.        break;    
  47.       case EnumMousePointPosition.MouseSizeTopRight:    
  48.        lCtrl.Top   = lCtrl.Top + (e.Y - p.Y);    
  49.        lCtrl.Width   = lCtrl.Width + (e.X - p1.X);    
  50.        lCtrl.Height = lCtrl.Height - (e.Y - p.Y);    
  51.        p1.X=e.X;    
  52.        p1.Y=e.Y; //'记录光标拖动的当前点    
  53.        break;    
  54.       case EnumMousePointPosition.MouseSizeTopLeft:    
  55.        lCtrl.Left   = lCtrl.Left + e.X - p.X;    
  56.        lCtrl.Top   = lCtrl.Top + (e.Y - p.Y);    
  57.        lCtrl.Width   = lCtrl.Width - (e.X - p.X);    
  58.        lCtrl.Height = lCtrl.Height - (e.Y - p.Y);    
  59.        break;    
  60.       default:    
  61.        break;    
  62.      }    
  63.      if (lCtrl.Width<MinWidth) lCtrl.Width=MinWidth;    
  64.      if (lCtrl.Height<MinHeight) lCtrl.Height=MinHeight;          
  65.    
  66.     }    
  67.     else   
  68.     {    
  69.      m_MousePointPosition = MousePointPosition(lCtrl.Size, e);   //'判断光标的位置状态    
  70.      switch (m_MousePointPosition)   //'改变光标    
  71.      {    
  72.       case EnumMousePointPosition.MouseSizeNone:    
  73.        this.Cursor = Cursors.Arrow;        //'箭头    
  74.        break;    
  75.       case EnumMousePointPosition.MouseDrag:    
  76.        this.Cursor = Cursors.SizeAll;      //'四方向    
  77.        break;    
  78.       case EnumMousePointPosition.MouseSizeBottom:    
  79.        this.Cursor = Cursors.SizeNS;       //'南北    
  80.        break;    
  81.       case EnumMousePointPosition.MouseSizeTop:    
  82.        this.Cursor = Cursors.SizeNS;       //'南北    
  83.        break;    
  84.       case EnumMousePointPosition.MouseSizeLeft:    
  85.        this.Cursor = Cursors.SizeWE;       //'东西    
  86.        break;    
  87.       case EnumMousePointPosition.MouseSizeRight:    
  88.        this.Cursor = Cursors.SizeWE;       //'东西    
  89.        break;    
  90.       case EnumMousePointPosition.MouseSizeBottomLeft:    
  91.        this.Cursor = Cursors.SizeNESW;     //'东北到南西    
  92.        break;    
  93.       case EnumMousePointPosition.MouseSizeBottomRight:    
  94.        this.Cursor = Cursors.SizeNWSE;     //'东南到西北    
  95.        break;    
  96.       case EnumMousePointPosition.MouseSizeTopLeft:    
  97.        this.Cursor = Cursors.SizeNWSE;     //'东南到西北    
  98.        break;    
  99.       case EnumMousePointPosition.MouseSizeTopRight:    
  100.        this.Cursor = Cursors.SizeNESW;     //'东北到南西    
  101.        break;    
  102.       default:    
  103.        break;    
  104.      }    
  105.     }    
  106.    
  107.    }    

[csharp] view plain copy
  1. 7、制作一个初始化过程,将界面panel1上的所有控件都绑定MyMouseDown、MyMouseLeave、MyMouseMove事件,记得在Form初始化或者Form_Load时先执行它。  
  2.   
  3. private void initProperty()    
  4. {    
  5.  for(int i = 0; i < this.panel1.Controls.Count; i++)     
  6.  {     
  7.   this.panel1.Controls[i].MouseDown+= new System.Windows.Forms.MouseEventHandler(MyMouseDown);    
  8.   this.panel1.Controls[i].MouseLeave+= new System.EventHandler(MyMouseLeave);    
  9.   this.panel1.Controls[i].MouseMove += new System.Windows.Forms.MouseEventHandler(MyMouseMove);    
  10.  }    
  11.    
  12. }    

[csharp] view plain copy
  1. 8、ok,在运行之前你在panel1上放几个控件,执行程序,应该可以随便移动、改变其大小了  
  2. C# WinForm控件的拖动和缩放的实现就此完成。  
展开阅读全文

没有更多推荐了,返回首页