private Point mouse_offset;
private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
   mouse_offset = new Point(-e.X, -e.Y);
}
private void Control_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        Point mousePos = Control.MousePosition;
        mousePos.Offset(mouse_offset.X, mouse_offset.Y);
        ((Control)sender).Location = ((Control)sender).Parent.PointToClient(mousePos);
    }
}
问题如题
我在网上找了这样段代码但是有点看不懂
首先mouse_offset为什么是负值
其次mousePos.Offset(mouse_offset.X, mouse_offset.Y);是移动后控件的位置 但是为什么还是在mousedown是的位置呢  
代码是正确的我验证过了。

解决方案 »

  1.   

    看不懂就没办法了.
    简单说下,mousedown记录的是控件原始位置.
      

  2.   

    拖放只有三个事件
    onmousedown   onmouseup  onmousemove
     搞清楚就简单了
      

  3.   

    mouse_offset = new Point(-e.X, -e.Y); Point mousePos = Control.MousePosition; 
    mousePos.Offset(mouse_offset.X, mouse_offset.Y); 这三句结合起来,是把mousePos的坐标转换成控件左上角的屏幕坐标。首先mouse_offset为什么是负值
    调用mousePos.Offset(负值);相当于减去 mouse_offset。
      

  4.   

    我觉得下面这个方法易懂
            private  Point  offset;        private void button1_MouseDown(object sender, MouseEventArgs e)
            {
                offset = e.Location;
            }        private void button1_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons .Left )
                {
                    int dx = e.X - offset.X;
                    int dy = e.Y - offset.Y;
                    button1.Location = new Point(button1.Location.X + dx, button1.Location.Y + dy);
                }
            }
      

  5.   

    这里面有相对坐标和绝对坐标的转换。
    我描述一下吧。如果鼠标在控件上按下时,在控件上的坐标是(10,20),这是相对于控件左上角的。那么mouse_offset=(-10,-20)。在鼠标保持按下并移动到某一点,鼠标的屏幕坐标变为(150,250),即mousePos = Control.MousePosition =(150,250)。
    此时控件左上角的屏幕坐标就应该是(150-10,250-20),即 mousePos.Offset(mouse_offset) = (150-10,250-20)。
    最后,需要把控件左上角的屏幕坐标,转换成相对于父容器的相对坐标。
    这就是最后一句做的,计算出控件左上角相对于父容器的坐标后,赋值给控件的Location属性,就移动了控件。
            ((Control)sender).Location = ((Control)sender).Parent.PointToClient(mousePos); 
      

  6.   

    我要把A控件拖到B控件的位置之后,A、B互换位置,这个该怎么做???
    我是新手,谢谢了!!!!!