C # - перемещение элемента управления в положение мыши - PullRequest
3 голосов
/ 24 апреля 2010

Я пытаюсь заставить элемент управления следовать за курсором, когда пользователь нажимает и перетаскивает элемент управления. Проблема в том, что 1.) элемент управления не перемещается в положение мыши, и 2.) элемент управления мигает и летит повсюду. Я пробовал несколько разных способов сделать это, но все до сих пор не удалось.

Я пробовал:

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

и

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

но ни одна из этих работ. Любая помощь приветствуется, и спасибо заранее!

Ответы [ 4 ]

10 голосов
/ 24 апреля 2010

Вот как это сделать:

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;
}

_Offset используется здесь для двух целей: отслеживание того, где мышь находилась на элементе управления, когда вы первоначально щелкнули по ней, а также отслеживание того, нажата ли кнопка мыши или нет (чтобы элемент управления не перетаскивать, когда курсор мыши проходит над ним, а кнопка не нажимается).

Вы определенно не хотите переключить if с в этом коде на while с, поскольку будет иметь значение.

2 голосов
/ 01 марта 2013

есть ошибки в ответе 1 1. Установите обработчики мыши для управления, а не для формирования как button1_MouseMove 2. не используйте этот вектор, но вместо этого ваш элемент управления (Point newlocation = button1.Location;) 3. вам не нужно переопределять обработчики.

в моем тесте после этих изменений кнопка (или другой элемент управления) перемещается нормально.

Chigook

1 голос
/ 21 марта 2015

Попробуйте переместить объект в соответствии с положением мыши, и приведенный ниже код собирает путь перемещения мыши и местоположение, сохраненное в массиве, чтобы получить путь, по которому движется точка мыши. Вы должны объявить arraylist глобально.

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();
    }
}
0 голосов
/ 15 мая 2013
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;
}
...