在Winform窗体中通过鼠标拖动,改变控件的位置。在拖动过程中,跟随鼠标显示一个与被拖动控件大小一样的黑框,用以模拟拖动效果。如下图: 以下是源代码。这里拖动了一个Button控件。如果需要,还可以在拖动时改变光标。
/Files/tssing/FormDrag.rar
Code
usingSystem;
usingSystem.Collections.Generic;
ponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceFormDrag
{
publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
}
privateControlcontrol;
privatevoidForm1_Load(objectsender,EventArgse)
{
this.Paint+=newSystem.Windows.Forms.PaintEventHandler(this.FormDrag_Paint);
control=newButton();
control.MouseDown+=newMouseEventHandler(control_MouseDown);
control.MouseMove+=newMouseEventHandler(control_MouseMove);
control.MouseUp+=newMouseEventHandler(control_MouseUp);
this.Controls.Add(control);
}
//鼠标按下坐标(control控件的相对坐标)
PointmouseDownPoint=Point.Empty;
//显示拖动效果的矩形
Rectanglerect=Rectangle.Empty;
//是否正在拖拽
boolisDrag=false;
voidcontrol_MouseDown(objectsender,MouseEventArgse)
{
if(e.Button==MouseButtons.Left)
{
mouseDownPoint=e.Location;
//记录控件的大小
rect=control.Bounds;
}
}
voidcontrol_MouseMove(objectsender,MouseEventArgse)
{
if(e.Button==MouseButtons.Left)
{
isDrag=true;
//重新设置rect的位置,跟随鼠标移动
rect.Location=getPointToForm(newPoint(e.Location.X-mouseDownPoint.X,e.Location.Y-mouseDownPoint.Y));
this.Refresh();
}
}
voidcontrol_MouseUp(objectsender,MouseEventArgse)
{
if(e.Button==MouseButtons.Left)
{
if(isDrag)
{
isDrag=false;
//移动control到放开鼠标的地方
control.Location=rect.Location;
this.Refresh();
}
reset();
}
}
//重置变量
privatevoidreset()
{
mouseDownPoint=Point.Empty;
rect=Rectangle.Empty;
isDrag=false;
}
//窗体重绘
privatevoidFormDrag_Paint(objectsender,PaintEventArgse)
{
if(rect!=Rectangle.Empty)
{
if(isDrag)
{//画一个和Control一样大小的黑框
e.Graphics.DrawRectangle(Pens.Black,rect);
}
else
{
e.Graphics.DrawRectangle(newPen(this.BackColor),rect);
}
}
}
//把相对与control控件的坐标,转换成相对于窗体的坐标。
privatePointgetPointToForm(Pointp)
{
returnthis.PointToClient(control.PointToScreen(p));
}
}
}