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

下面的几个步骤将逐步实现C# WinForm控件的拖动和缩放的功能。

1、定义一个枚举类型,描述光标状态

  1. private enum EnumMousePointPosition  
  2.    {  
  3.     MouseSizeNone   = 0, //'无  
  4.     MouseSizeRight   = 1, //'拉伸右边框  
  5.     MouseSizeLeft   = 2, //'拉伸左边框  
  6.     MouseSizeBottom   = 3, //'拉伸下边框  
  7.     MouseSizeTop   = 4, //'拉伸上边框  
  8.     MouseSizeTopLeft = 5, //'拉伸左上角  
  9.     MouseSizeTopRight = 6, //'拉伸右上角  
  10.     MouseSizeBottomLeft = 7, //'拉伸左下角  
  11.     MouseSizeBottomRight= 8, //'拉伸右下角  
  12.     MouseDrag    = 9   // '鼠标拖动  
  13.    } 

2、定义几个变量

  1. const int Band = 5;  
  2.    const int MinWidth=10;  
  3.    const int MinHeight=10;  
  4.    private EnumMousePointPosition m_MousePointPosition;  
  5.    private Point p,p1; 

3、定义自己的MyMouseDown事件

  1. private void MyMouseDown(object sender,System.Windows.Forms.MouseEventArgs e)  
  2. {  
  3.  p.X=e.X;  
  4.  p.Y=e.Y;  
  5.  p1.X=e.X;  
  6.  p1.Y=e.Y;     

4、定义自己的MyMouseLeave事件

  1. private void MyMouseLeave(object sender, System.EventArgs e)  
  2. {  
  3.  m_MousePointPosition = EnumMousePointPosition.MouseSizeNone;  
  4.  this.Cursor=Cursors.Arrow;  

5、设计一个函数,确定光标在控件不同位置的样式

  1. private EnumMousePointPosition MousePointPosition(Size size,System.Windows.Forms.MouseEventArgs e)  
  2. {  
  3.  
  4.  if ((e.X >= -1 * Band) | (e.X <= size.Width) | (e.Y >= -1 * Band) | (e.Y <= size.Height))   
  5.  {  
  6.   if (e.X < Band)   
  7.   {  
  8.    if (e.Y < Band) {return EnumMousePointPosition.MouseSizeTopLeft;}  
  9.    else   
  10.    {  
  11.     if (e.Y > -1 * Band + size.Height)   
  12.     {return EnumMousePointPosition.MouseSizeBottomLeft;}  
  13.     else   
  14.     {return EnumMousePointPosition.MouseSizeLeft;}  
  15.    }  
  16.   }  
  17.   else 
  18.   {  
  19.    if (e.X > -1 * Band + size.Width)  
  20.    {  
  21.     if (e.Y < Band)  
  22.     {return EnumMousePointPosition.MouseSizeTopRight;}  
  23.     else   
  24.     {  
  25.      if (e.Y > -1 * Band + size.Height)  
  26.      {return EnumMousePointPosition.MouseSizeBottomRight;}  
  27.      else 
  28.      {return EnumMousePointPosition.MouseSizeRight;}  
  29.     }  
  30.    }  
  31.    else 
  32.    {  
  33.     if (e.Y < Band)   
  34.     {return EnumMousePointPosition.MouseSizeTop;}  
  35.     else 
  36.     {  
  37.      if (e.Y > -1 * Band + size.Height)   
  38.      {return EnumMousePointPosition.MouseSizeBottom;}  
  39.      else   
  40.      {return EnumMousePointPosition.MouseDrag;}  
  41.     }  
  42.    }  
  43.   }  
  44.  }  
  45.  else   
  46.  {return EnumMousePointPosition.MouseSizeNone;}  

6、定义自己的MyMouseMove事件,在这个事件里,会使用上面设计的函数

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

7、制作一个初始化过程,将界面panel1上的所有控件都绑定MyMouseDown、MyMouseLeave、MyMouseMove事件,记得在Form初始化或者Form_Load时先执行它。

  1. private void initProperty()  
  2. {  
  3.  for(int i = 0; i < this.panel1.Controls.Count; i++)   
  4.  {   
  5.   this.panel1.Controls[i].MouseDown+= new System.Windows.Forms.MouseEventHandler(MyMouseDown);  
  6.   this.panel1.Controls[i].MouseLeave+= new System.EventHandler(MyMouseLeave);  
  7.   this.panel1.Controls[i].MouseMove += new System.Windows.Forms.MouseEventHandler(MyMouseMove);  
  8.  }  
  9.  
  10. }  

8、ok,在运行之前你在panel1上放几个控件,执行程序,应该可以随便移动、改变其大小了

C# WinForm控件的拖动和缩放的实现就此完成。

posted on 2010-06-02 15:51  努力实现目标  阅读(2891)  评论(0编辑  收藏  举报