通过鼠标任意拖动.NET Winform窗体中的控件

来源:互联网 发布:mac ae 2015 语言包 编辑:程序博客网 时间:2024/05/22 10:36

在Winform窗体中通过鼠标拖动,改变控件的位置。在拖动过程中,跟随鼠标显示一个与被拖动控件大小一样的黑框,用以模拟拖动效果。如下图:

以下是源代码。这里拖动了一个Button控件。如果需要,还可以在拖动时改变光标。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. namespace WindowsApplication1
  9. {
  10.     public partial class FormDrag : Form
  11.     {
  12.         //将被拖动的控件
  13.         private Control control;
  14.         public FormDrag()
  15.         {
  16.             InitializeComponent();
  17.             this.Paint += new System.Windows.Forms.PaintEventHandler(this.FormDrag_Paint);
  18.             control = new Button();
  19.             control.MouseDown += new MouseEventHandler(control_MouseDown);
  20.             control.MouseMove += new MouseEventHandler(control_MouseMove);
  21.             control.MouseUp += new MouseEventHandler(control_MouseUp);
  22.             this.Controls.Add(control);            
  23.         }
  24.        
  25.         //鼠标按下坐标(control控件的相对坐标)
  26.         Point mouseDownPoint = Point.Empty;
  27.         //显示拖动效果的矩形
  28.         Rectangle rect = Rectangle.Empty;
  29.         //是否正在拖拽
  30.         bool isDrag = false;
  31.         void control_MouseDown(object sender, MouseEventArgs e)
  32.         {
  33.             if (e.Button == MouseButtons.Left)
  34.             {
  35.                 mouseDownPoint = e.Location;
  36.                 //记录控件的大小
  37.                 rect = control.Bounds;
  38.             }
  39.         }
  40.         void control_MouseMove(object sender, MouseEventArgs e)
  41.         {
  42.             if (e.Button == MouseButtons.Left)
  43.             {
  44.                 isDrag = true;
  45.                 //重新设置rect的位置,跟随鼠标移动
  46.                 rect.Location = getPointToForm(new Point(e.Location.X - mouseDownPoint.X, e.Location.Y - mouseDownPoint.Y));
  47.                 this.Refresh();
  48.                 
  49.             }
  50.         }
  51.         void control_MouseUp(object sender, MouseEventArgs e)
  52.         {
  53.             if (e.Button == MouseButtons.Left)
  54.             {
  55.                 if (isDrag)
  56.                 {
  57.                     isDrag = false;
  58.                     //移动control到放开鼠标的地方
  59.                     control.Location = rect.Location;
  60.                     this.Refresh();
  61.                 }
  62.                 reset();
  63.             }
  64.         }
  65.         //重置变量
  66.         private void reset()
  67.         {
  68.             mouseDownPoint = Point.Empty;
  69.             rect = Rectangle.Empty;
  70.             isDrag = false;
  71.         }
  72.         //窗体重绘
  73.         private void FormDrag_Paint(object sender, PaintEventArgs e)
  74.         {
  75.             if (rect != Rectangle.Empty)
  76.             {
  77.                 if (isDrag)
  78.                 {//画一个和Control一样大小的黑框
  79.                     e.Graphics.DrawRectangle(Pens.Black, rect);
  80.                 }
  81.                 else
  82.                 {
  83.                     e.Graphics.DrawRectangle(new Pen(this.BackColor), rect);
  84.                 }
  85.             }
  86.         }
  87.         //把相对与control控件的坐标,转换成相对于窗体的坐标。
  88.         private Point getPointToForm(Point p)
  89.         {
  90.             return this.PointToClient(control.PointToScreen(p));
  91.         }
  92.         
  93.     }
  94. }

0 0