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


    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控件的拖动和缩放的实现就此完成。

  • 相关阅读:
    Apache-一个IP多个主机域名
    Apache-配置详解
    Apache-配置、测试和调试
    Linux-Memcache和Redis常用命令
    Linux-Linux下安装redis报错"undefined reference to__sync_add_and_fetch_4"解决办法
    C-从源文件到可执行文件的详细编译链接过程
    JavaScript-jQuery报TypeError $(...) is null错误(jQuery失效)解决办法
    MSSQL-SQL SERVER一些使用中的技巧
    unity 在Game视图中显示Gizmos
    unity Transform.TransformPoint
  • 原文地址:https://www.cnblogs.com/hfzsjz/p/1750045.html
Copyright © 2020-2023  润新知