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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • WinForm实现的图片拖拽与缩放功能示例

    本文实例讲述了WinForm实现的图片拖拽与缩放功能.分享给大家供大家参考,具体如下: 最近做项目的时候遇到上传施工平面布置图,查看,因为图片比较大,一般的显示器分辨率无法显示全,然后还需要放大看清楚图片里面的文字内容,所以需要用到图片的拖拽与缩放功能.这里整理下具体操作. 首先新建一个窗体,拖一个panel控件到窗体中,然后在拖一个pictureobx控件到panel中,然后在添加个上传图片的按钮: 具体代码: using System; using System.Collections.Ge

  • WinForm实现移除控件某个事件的方法

    本文实例讲述了WinForm实现移除控件某个事件的方法,供大家参考借鉴一下.具体功能代码如下: 主要功能部分代码如下: /// <summary> /// 移除控件某个事件 /// </summary> /// <param name="control">控件</param> /// <param name="eventName">需要移除的控件名称eg:EventClick</param> p

  • C#的winform控件命名规范

    本文详细讲述了C#的winform控件命名规范.分享给大家供大家参考.具体如下: 注:这里用红字标记的部分表示有重复出现,括号内为替代表示方案 1.标准控件 序号 控件类型简写 控件类型 1 btn Button 2 chk CheckBox 3 ckl CheckedListBox 4 cmb ComboBox 5 dtp DateTimePicker 6 lbl Label 7 llb LinkLabel 8 lst ListBox 9 lvw ListView 10 mtx MaskedT

  • WinForm拖拽控件生成副本的解决方法

    本文讲述了WinForm中实现拖拽效果的功能,即在WinForm中有一个Button,可以实现拖拽这个Button到目标位置后生成一个该控件的副本的功能.具体操作步骤如下: 要实现该功能主要分成如下三步: 1)确定被拖拽的对象:这里是Button(要使得Button被单击之后可以拖拽,那么必须处理其MouseDown事件,同时调用其DoDragDrop--该函数接受两个参数:i)要拖动的数据.ii)拖动的效果(该效果是2"目标位置"所能够接受的效果,是一个枚举值): C#代码如下: B

  • C# Winform 让整个窗口都可以拖动

    今天在网上查一些资料的时候, 无意中发现另一种办法, 非常方便, 调用系统的 API 来实现的, 效果也很好. 赶紧收藏了~ 复制代码 代码如下: [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int

  • C#实现Winform鼠标拖动窗口大小时设定窗口最小尺寸的方法

    本文实例讲述了C#实现Winform鼠标拖动窗口大小时设定窗口最小尺寸的方法.分享给大家供大家参考,具体如下: winform 程序运行过程中,用户用鼠标拖动窗体大小时,如将窗体调整得极小,可能窗体上的控件就面目全非(或看不到了),用下面的代码可以设定窗口的最小尺寸,以防止这种情况 private void Form1_ResizeEnd(object sender, EventArgs e) { //this.Text = "2width:" + this.Width.ToStrin

  • C# WinForm实现窗体上控件自由拖动功能示例

    本文实例讲述了C# WinForm实现窗体上控件自由拖动功能.分享给大家供大家参考,具体如下: 说明:首先在窗体上放一个PictrueBox控件,命名为pb1,拖动完整代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; usin

  • WinForm自定义控件应用实例

    C#的WinForm有一些控件具备自绘的功能,这就意味着你可以对这些控件进行自绘,可以起到意想不到的视觉效果.本文所述的以下控件就是通过一些简单的控件转变过来的.具体示例如下: 1.横向选项卡重绘: 这里的"横向"对话框其实是通过一个TabControl进行"方向旋转".重绘控件项等操作进行实现的.步骤如下: ①.Alignment:用于控制选项卡的方向(设置为Left). ②.SizeMode:用于调整每个选项卡,默认是Normal(非自绘模式),此处应该设置为F

  • winform实现拖动文件到窗体上的方法

    本文实例讲述了winform实现拖动文件到窗体上的方法.分享给大家供大家参考.具体如下: private void Form5_Load(object sender, EventArgs e) { this.AllowDrop=true; } private void Form5_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files

  • WinForm子窗体访问父窗体控件的实现方法

    Form1主窗体: 复制代码 代码如下: public delegate void SetVisiableHandler();//定义委托类型 private void button1_Click(object sender,EventArgs e)//单击事件,打开子窗体{    Form2 frm = new Form2(new SetVisiableHandler(SetVisiable));    frm.Show();} private void SetVisiable(){    d

随机推荐