Przesuwanie myszą komponentu po formularzu

0

Witam forumowiczów!
To mój pierwszy post. Zaczynam dopiero naukę VS 2010 i natrafiłem na problem, którego nie potrafię rozwiązać.
Chciałbym, aby naciśnięcie klawisza myszy nad obiektem i trzymanie go powodowało zmianę pozycji tego obiektu zgodnie z przesunięciem kursora.
Nie bardzo wiem które zdarzenie jest do tego dobre oraz jak pobierać współrzędne kursora względem początku formularza, a nie ekranu.
Próbowałem bez skutku do przesuwanie obiektu ovalShape używać:

 
private void ovalShape1_MouseDown(object sender, MouseEventArgs e)
{
            ovalShape1.Location = new Point(Cursor.Position.X -Form1.ActiveForm.Location.X -e.X ,Cursor.Position.Y -Form1.ActiveForm.Location.Y -e.Y);  
}

Proszę o pomoc :)
Hubert

1

Więc tak:
Tworzysz zdarzenia MouseDown, MouseMove i MouseUp. W kodzie designera, tam gdzie masz inicializacię swojego komponentu wycinasz dodawanie wydarzenia Move i wklejasz je do MouseDown. Teraz w MouseDown zapisujesz wartości e.Y i e.X do jakiś zmiennych globalnych.
Przykład podam na buttonie.

 
private void button1_MouseDown(object sender, MouseEventArgs e)
        {
             this.punkt.X = e.X;
             this.punkt.Y = e.Y;
            
             this.button1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.button1_MouseMove);
        }

W MouseMove do lokalizacji komponentu dodajesz lokalizację kursora ( e ) i odejmujesz wartości wcześniej zapisane zmienne globalne, dla Y i X osobno.

 
private void button1_MouseMove(object sender, MouseEventArgs e)
        {
            int pozY, pozX;
			  pozY = this.button1.Location.Y + e.Y - this.punkt.Y;
			  pozX = this.button1.Location.X + e.X - this.punkt.X;
			
			this.button1.Location = new Point(pozX , pozY ); 
        }

W MouseUp robisz to samo, tylko dodatkowo musisz usunąć zdarzenie MouseMove, żeby po zwolnieniu przycisku, komponent nie przesuwał ci się dalej razem z myszką.

 
private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            int  pozX, pozY;

			pozX = this.button1.Location.X +e.X - this.punkt.X;
            pozY = this.button1.Location.Y + e.Y - this.punkt.Y;

			 this.button1.Location = new Point(pozX ,pozY);
             this.button1.MouseMove -= new System.Windows.Forms.MouseEventHandler(this.button1_MouseMove);
			 }

Mam nadzieję, że o to tobie chodziło:)

0

Trafiłeś w sedno!
Dziękuję :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1