C#-将控件移动到鼠标';s位置

C#-将控件移动到鼠标';s位置,c#,controls,mouse,position,flicker,C#,Controls,Mouse,Position,Flicker,我试图让一个控件在用户单击并拖动该控件时跟随光标。问题是1.)控件没有移动到鼠标的位置,2.)控件闪烁并四处飞行。我尝试过几种不同的方法,但都失败了 我试过: protected override void OnMouseDown(MouseEventArgs e) { while (e.Button == System.Windows.Forms.MouseButtons.Left) { this.Location = e.Location;

我试图让一个控件在用户单击并拖动该控件时跟随光标。问题是1.)控件没有移动到鼠标的位置,2.)控件闪烁并四处飞行。我尝试过几种不同的方法,但都失败了

我试过:

protected override void OnMouseDown(MouseEventArgs e)
{
     while (e.Button == System.Windows.Forms.MouseButtons.Left)
     {
          this.Location = e.Location;
     }
}

但这两种方法都不管用。感谢您的帮助,并提前表示感谢

以下是如何做到这一点:

private Point _Offset = Point.Empty;

protected override void MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        _Offset = new Point(e.X, e.Y);
    }
}

protected override void MouseMove(object sender, MouseEventArgs e)
{
    if (_Offset != Point.Empty)
    {
        Point newlocation = this.Location;
        newlocation.X += e.X - _Offset.X;
        newlocation.Y += e.Y - _Offset.Y;
        this.Location = newlocation; 
    }
}

protected override void MouseUp(object sender, MouseEventArgs e)
{
    _Offset = Point.Empty;
}
\u Offset
在这里用于两个目的:跟踪最初单击鼠标时鼠标在控件上的位置,以及跟踪鼠标按钮是否已按下(以便鼠标光标在控件上方且按钮未按下时不会拖动控件)


您肯定不想将此代码中的
if
s切换到
,而
s,因为这会产生影响。

答案1中有错误 1.将鼠标处理程序设置为控件,而不是窗体 像按钮一样移动鼠标 2.不要使用此向量,而是使用控件(Point newlocation=button1.Location;) 3.不需要重写处理程序

在我的测试中,这些更改后按钮(或其他控件)移动良好


Chigook

尝试根据鼠标位置移动对象,下面给出的代码是收集鼠标的移动路径和保存在arraylist中的位置,以获得鼠标点移动的路径。您必须全局声明arraylist

private Point ptMouseDown=new Point();

protected override void MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        ptMouseDown = new Point(e.X, e.Y);
    }
}

protected override void MouseMove(object sender, MouseEventArgs e)
{
    if (_Offset != Point.Empty)
    {
        Pointf[] ptArr=new Pointf[]{this.Location};
        Point Diff=new Point(e.X-ptMouseDown.X,e.Y-ptMouseDown.Y);
        Matrix mat=new Matrix();
        mat.Translate(Diff.X,Diff.Y);
        mat.TransFromPoints(ptArr);
        this.Location=ptArr[0];
    }
}   

protected override void MouseUp(object sender, MouseEventArgs e)
{
    _Offset = Point.Empty;
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        ArrayList inList = new ArrayList();
        inList.Add(e.X);
        inList.Add(e.Y);
        list.Add(inList);
    }
}
当用户单击按钮时,控件必须沿用户在屏幕中拖动的路径移动

private void button1_Click_2(object sender, EventArgs e)
{
    foreach (ArrayList li in list)
    {
        pic_trans.Visible = true;
        pic_trans.Location = new Point(Convert.ToInt32(li[0]), Convert.ToInt32(li[1]));
        pic_trans.Show();
    }
}

我已经试过了,没什么区别。尽管如此,我还是很感激你的努力。+1:MusiGenesis的代码对我来说很有魅力,但只做了一点修改:我创建了一个新的用户控件->覆盖三个方法OnMouseDown、OnMouseUp和OnMouseMove->每个方法的第一行都是对基方法的调用,即base.OnMouseDown(e),base.OnMouseMove(e),和base.OnMouseUp(e)。->代码的其余部分如MusiGenesis所述。非常感谢!这个新答案很有魅力!我真的很感激!
private void button1_Click_2(object sender, EventArgs e)
{
    foreach (ArrayList li in list)
    {
        pic_trans.Visible = true;
        pic_trans.Location = new Point(Convert.ToInt32(li[0]), Convert.ToInt32(li[1]));
        pic_trans.Show();
    }
}