2011-02-08 2 views
0

Я собираюсь переместить кнопку с помощью мыши. Все в порядке, но когда я нажимаю кнопку мыши на кнопку, слева и сверху кнопки (левый верхний угол) будет располагаться на курсоре pos.Перемещение элемента управления мышью

Я не хочу, чтобы это произошло. где ошибка в моем коде?

private void button1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
     clicked = true; 
    } 

} 

private void button1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (clicked) 
    { 
     Point p = new Point();//in form coordinates 
     p.X = e.X + button1.Left; 
     p.Y = e.Y + button1.Top; 
     button1.Left = p.X; 
     button1.Top = p.Y ; 

    } 

} 

private void button1_MouseUp(object sender, MouseEventArgs e) 
{ 
    clicked = false; 
} 
+0

ClientToScreen и ScreenToClient координаты –

ответ

3

Я нашел его ...

вот полный код:

private void button1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
     Point p = ConvertFromChildToForm(e.X, e.Y, button1); 
     iOldX = p.X; 
     iOldY = p.Y; 
     iClickX = e.X; 
     iClickY = e.Y; 
     clicked = true; 
    } 

} 

private void button1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (clicked) 
    { 
     Point p = new Point();//in form coordinates 
     p.X = e.X + button1.Left; 
     p.Y = e.Y + button1.Top; 
     button1.Left = p.X - iClickX; 
     button1.Top = p.Y - iClickY; 

    } 

} 

private void button1_MouseUp(object sender, MouseEventArgs e) 
{ 
    clicked = false; 
} 
+0

Полный код должен показать 'метод ConvertFromChildToForm'. –

1

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

private void button1_MouseMove(object sender, MouseEventArgs e) { 
     if (clicked) { 
     Point p = new Point(); //in form coordinates 
     p.X = e.X + button1.Left - (button1.Width/2); 
     p.Y = e.Y + button1.Top - (button1.Height/2); 
     button1.Left = p.X; 
     button1.Top = p.Y; 
     } 
    } 
+0

Нет, возможно, положение мыши в кнопке (30,12);
Так что мы не можем сказать, что его центр кнопки. –

+0

Действительно, в некоторых случаях он не останется точно в центре. Это было простое решение проблемы. Я думаю, ваш первый подход хорош, потому что курсор остается в том же месте при перетаскивании. – Beccari

8

Этот это все, что вам нужно

private Point MouseDownLocation; 

    private void MyControl_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      MouseDownLocation = e.Location; 
     } 
    } 

    private void MyControl_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      this.Left = e.X + this.Left - MouseDownLocation.X; 
      this.Top = e.Y + this.Top - MouseDownLocation.Y; 
     } 
    }