如何利用C# WinForm实现控件的拖动和缩放

本篇内容主要讲解“如何利用C# WinForm实现控件的拖动和缩放”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何利用C# WinForm实现控件的拖动和缩放”吧!

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

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

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

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

2、定义几个变量

const int Band = 5;     const int MinWidth=10;     const int MinHeight=10;     private EnumMousePointPosition m_MousePointPosition;     private Point p,p1;

3、定义自己的MyMouseDown事件

private void MyMouseDown(object sender,System.Windows.Forms.MouseEventArgs e)  {   p.X=e.X;   p.Y=e.Y;   p1.X=e.X;   p1.Y=e.Y;     }

4、定义自己的MyMouseLeave事件

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

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

private EnumMousePointPosition MousePointPosition(Size size,System.Windows.Forms.MouseEventArgs e)  {    if ((e.X >= -1 * Band) | (e.X <= size.Width) | (e.Y >= -1 * Band) | (e.Y <= size.Height))    {    if (e.X < Band)     {     if (e.Y < Band) {return EnumMousePointPosition.MouseSizeTopLeft;}     else      {      if (e.Y > -1 * Band + size.Height)       {return EnumMousePointPosition.MouseSizeBottomLeft;}      else       {return EnumMousePointPosition.MouseSizeLeft;}     }    }    else   {     if (e.X > -1 * Band + size.Width)     {      if (e.Y < Band)      {return EnumMousePointPosition.MouseSizeTopRight;}      else       {       if (e.Y > -1 * Band + size.Height)       {return EnumMousePointPosition.MouseSizeBottomRight;}       else      {return EnumMousePointPosition.MouseSizeRight;}      }     }     else    {      if (e.Y < Band)       {return EnumMousePointPosition.MouseSizeTop;}      else     {       if (e.Y > -1 * Band + size.Height)        {return EnumMousePointPosition.MouseSizeBottom;}       else        {return EnumMousePointPosition.MouseDrag;}      }     }    }   }   else    {return EnumMousePointPosition.MouseSizeNone;}  }

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

   private void MyMouseMove(object sender,System.Windows.Forms.MouseEventArgs e)     {      Control lCtrl =(sender as Control);       if (e.Button==MouseButtons.Left)      {       switch (m_MousePointPosition)       {        case EnumMousePointPosition.MouseDrag:               lCtrl.Left =lCtrl.Left+ e.X - p.X;         lCtrl.Top =lCtrl.Top+ e.Y - p.Y;         break;        case EnumMousePointPosition.MouseSizeBottom:         lCtrl.Height = lCtrl.Height + e.Y - p1.Y;         p1.X=e.X;         p1.Y=e.Y; //'记录光标拖动的当前点         break;        case EnumMousePointPosition.MouseSizeBottomRight:         lCtrl.Width   = lCtrl.Width + e.X - p1.X;         lCtrl.Height = lCtrl.Height + e.Y - p1.Y;         p1.X=e.X;         p1.Y=e.Y; //'记录光标拖动的当前点         break;        case EnumMousePointPosition.MouseSizeRight:         lCtrl.Width   = lCtrl.Width + e.X - p1.X;        //       lCtrl.Height = lCtrl.Height + e.Y - p1.Y;         p1.X=e.X;         p1.Y=e.Y; //'记录光标拖动的当前点         break;        case EnumMousePointPosition.MouseSizeTop:         lCtrl.Top   = lCtrl.Top + (e.Y - p.Y);         lCtrl.Height = lCtrl.Height - (e.Y - p.Y);         break;        case EnumMousePointPosition.MouseSizeLeft:         lCtrl.Left   = lCtrl.Left + e.X - p.X;         lCtrl.Width   = lCtrl.Width - (e.X - p.X);         break;        case EnumMousePointPosition.MouseSizeBottomLeft:         lCtrl.Left   = lCtrl.Left + e.X - p.X;         lCtrl.Width   = lCtrl.Width - (e.X - p.X);         lCtrl.Height = lCtrl.Height+ e.Y - p1.Y;         p1.X=e.X;         p1.Y=e.Y; //'记录光标拖动的当前点         break;        case EnumMousePointPosition.MouseSizeTopRight:         lCtrl.Top   = lCtrl.Top + (e.Y - p.Y);         lCtrl.Width   = lCtrl.Width + (e.X - p1.X);         lCtrl.Height = lCtrl.Height - (e.Y - p.Y);         p1.X=e.X;         p1.Y=e.Y; //'记录光标拖动的当前点         break;        case EnumMousePointPosition.MouseSizeTopLeft:         lCtrl.Left   = lCtrl.Left + e.X - p.X;         lCtrl.Top   = lCtrl.Top + (e.Y - p.Y);         lCtrl.Width   = lCtrl.Width - (e.X - p.X);         lCtrl.Height = lCtrl.Height - (e.Y - p.Y);         break;        default:         break;       }       if (lCtrl.Width<MinWidth) lCtrl.Width=MinWidth;       if (lCtrl.Height<MinHeight) lCtrl.Height=MinHeight;             }      else     {       m_MousePointPosition = MousePointPosition(lCtrl.Size, e);   //'判断光标的位置状态       switch (m_MousePointPosition)   //'改变光标       {        case EnumMousePointPosition.MouseSizeNone:         this.Cursor = Cursors.Arrow;        //'箭头         break;        case EnumMousePointPosition.MouseDrag:         this.Cursor = Cursors.SizeAll;      //'四方向         break;        case EnumMousePointPosition.MouseSizeBottom:         this.Cursor = Cursors.SizeNS;       //'南北         break;        case EnumMousePointPosition.MouseSizeTop:         this.Cursor = Cursors.SizeNS;       //'南北         break;        case EnumMousePointPosition.MouseSizeLeft:         this.Cursor = Cursors.SizeWE;       //'东西         break;        case EnumMousePointPosition.MouseSizeRight:         this.Cursor = Cursors.SizeWE;       //'东西         break;        case EnumMousePointPosition.MouseSizeBottomLeft:         this.Cursor = Cursors.SizeNESW;     //'东北到南西         break;        case EnumMousePointPosition.MouseSizeBottomRight:         this.Cursor = Cursors.SizeNWSE;     //'东南到西北         break;        case EnumMousePointPosition.MouseSizeTopLeft:         this.Cursor = Cursors.SizeNWSE;     //'东南到西北         break;        case EnumMousePointPosition.MouseSizeTopRight:         this.Cursor = Cursors.SizeNESW;     //'东北到南西         break;        default:         break;       }      }      }

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

private void initProperty()  {   for(int i = 0; i < this.panel1.Controls.Count; i++)    {     this.panel1.Controls[i].MouseDown+= new System.Windows.Forms.MouseEventHandler(MyMouseDown);    this.panel1.Controls[i].MouseLeave+= new System.EventHandler(MyMouseLeave);    this.panel1.Controls[i].MouseMove += new System.Windows.Forms.MouseEventHandler(MyMouseMove);   }   }

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

到此,相信大家对“如何利用C# WinForm实现控件的拖动和缩放”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!