如何让控件支持拖动(不是拖放)呢?很简单的
只需要处理鼠标按下、移动、释放三个消息就可以了,按下时开始记录鼠标位置,移动时计算鼠标移动距离,重设控件位置,鼠标释放时结束拖动
下面这段代码可以直接应用于任何控件,参数Control是所有控件的基类,因此可以应用于任何控件
m_OnDrag标示是否在拖动中
m_LastPoint记录上一次鼠标的位置
这里面没有使用事件参数提供的鼠标位置,因为这个值飘得厉害,会闪,用Cursor.Position就不会闪
PointToClient用来把屏幕坐标换算成客户区位置
class DragControl { static public bool m_OnDrag = false; static private Point m_LastPoint = new Point(); static public void EnableDrag(Control control) { //添加事件处理程序 control.MouseDown += new MouseEventHandler(MouseDown); control.MouseMove += new MouseEventHandler(MouseMove); control.MouseUp += new MouseEventHandler(MouseUp); } static private void MouseDown(object sender, MouseEventArgs e) { Control control = (Control)sender; Point newpoint = control.Parent.PointToClient(Cursor.Position); m_LastPoint = newpoint; m_OnDrag = true; } static private void MouseMove(object sender, MouseEventArgs e) { if (m_OnDrag) { Control control = (Control)sender; Point newpoint=control.Parent.PointToClient(Cursor.Position); Point tmp=new Point(control.Location);//这几句临时写的,未经测试(因为原来的代码涉及到别的内容)
tmp.X += newpoint.X - m_LastPoint.X; tmp.Y += newpoint.Y - m_LastPoint.Y;
control.Location=tmp; m_LastPoint = newpoint; } } static private void MouseUp(object sender, MouseEventArgs e) { m_OnDrag = false; }
}