實現控件的拖拽和跟隨鼠標移動
圖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); } } } }
順便附上一張刻度圖(一格子一個像素):