实现控件的拖拽和跟随鼠标移动
图1(拖拽):
图2(鼠标点击移动):
代码:
namespace TestSelect { public partial class DragForm : Form { public DragForm() { InitializeComponent(); } private void DragForm_Load(object sender, EventArgs e) { label1.MouseDown += new MouseEventHandler(mouseDown); label2.MouseDown += new MouseEventHandler(mouseDown); label3.MouseDown += new MouseEventHandler(mouseDown); this.panel2.DragEnter += new DragEventHandler(panelDragEnter); this.panel2.DragDrop += new DragEventHandler(panelDragDrop); } //鼠标按下事件,为拖放操作做准备 void mouseDown(object sender, MouseEventArgs e) { DoDragDrop(sender, DragDropEffects.Move); } //当拖拽控件到容器上时发生 private void panelDragEnter(object sender, DragEventArgs e) { object data = e.Data.GetData(typeof(Label)); if (data != null) { e.Effect = DragDropEffects.Move; } else { e.Effect = DragDropEffects.None; } } //当完成拖拽操作时发生 private void panelDragDrop(object sender, DragEventArgs e) { object data = e.Data.GetData(typeof(Label)); Panel bpl = (Panel)sender; //在panel2中按鼠标位置移动标签 foreach (Label btn in this.panel1.Controls) { if (data == btn) { Label lb = new Label(); lb.Text = btn.Text; lb.BackColor = System.Drawing.Color.White; bpl.Controls.Add(lb);//添加标签 lb.Left = Control.MousePosition.X-this.Location.X ; lb.BorderStyle = BorderStyle.FixedSingle; lb.MouseDown += new MouseEventHandler(lable_MouseDown); lb.MouseUp += new MouseEventHandler(lable_MouseUp); lb.MouseMove += new MouseEventHandler(lable_MouseMove); } } } //鼠标移动窗体移动 private bool isMouseDown = false; private Point lableLocation; //lable的location private Point mouseOffset; //鼠标的按下位置 private void lable_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { isMouseDown = true; lableLocation = ((Label)sender).Location; mouseOffset = Control.MousePosition; } } private void lable_MouseUp(object sender, MouseEventArgs e) { isMouseDown = false; } private void lable_MouseMove(object sender, MouseEventArgs e) { int _x = 0; int _y = 0; if (isMouseDown) { Point pt = Control.MousePosition; _x = mouseOffset.X - pt.X; _y = mouseOffset.Y - pt.Y; ((Label)sender).Location = new Point(lableLocation.X - _x, lableLocation.Y -_y); } } } }
顺便附上一张刻度图(一格子一个像素):