[C#] Form mit der Maus verschieben

Drucken
( 1 Vote )
Hauptkategorie: Programmieren Kategorie: C#
Erstellt am 08.12.2011 Zuletzt aktualisiert am 02.02.2012 Geschrieben von Jonny132
Wollen Sie eine Form mit verschieben, ohne dass dafür auf die Titelleiste geklickt wird, also irgendwo auf der Form bietet sich dafür ein kleiner Trick an den man verwenden kann. Ich zeige euch dies an einem Beispiel.
Zuerst benötigen wir eine globale Variable in der wir die aktuellen Mauskoordinaten abspeichern können.

Globale Point Variable

Point startPoint;
Im Form Load Ereigniss abbonieren wir nun das Form- MouseDown, MouseUp und MouseMove Ereignis. Zu Bemerken ist dass das MouseUp und MouseDown auf den gleichen EventHandler zugreiffen.

Form Load Ereignis

 private void Form1_Load(object sender, EventArgs e)
 {
   this.MouseDown += new MouseEventHandler(Form1_MouseAction);
   this.MouseUp += new MouseEventHandler(Form1_MouseAction);
   this.MouseMove += new MouseEventHandler(Form1_MouseMove);
 }
Gehen wir zunächst näher auf den Form1_MouseAction EventHandler ein.

Form MouseAction Event

 void Form1_MouseAction(object sender, MouseEventArgs e)
 {
   if (startPoint.IsEmpty)
   {
     startPoint = new Point(-e.Location.X - 8, -e.Location.Y - 30);
   }
   else
   {
     startPoint = Point.Empty;
   }
 }

Zur Erklärung: Die globale Point Variable missbrauchen wir als Abfrage ob die Maus gerade gedrückt oder losgelassen wurde. Im falle eines MouseDown hat die Point Variable den Wert IsEmpty im Falle eines MouseUp hat sie einen zugewiesenen Wert.

Im jeweiligen anderen Fall setzen wir die Point Variable nun auf den gegensätzlichen Wert.

Wir benützen den Kehrwert da wir bei der späteren Berechnung diesen benötigen. Die Integer 8 und 30 werden abgezogen für die Breite des Randes (8 Pixel für den Rand Links und 30 Pixel für die Titelleiste oben).

Hätte man eine Form mit der Einstellung BorderStyle = none, müsste man diese Werte weglassen.

Form Mouse Move Event 

 void Form1_MouseMove(object sender, MouseEventArgs e)
 {
   if (!startPoint.IsEmpty)
   {
     Point endPoint = this.PointToScreen(e.Location);
     this.Location = new Point(startPoint.X + endPoint.X,
                               startPoint.Y + endPoint.Y);
   }
 }

Nun sind alle Vormaßnahmen getroffen um die Form im Falle eines Mausklickes zu verschieben.

Im Mouse Move Event wird nun abgefragt ob die globale Point Variable einen Wert hat (Unterscheidung zwischen gedrückt und losgelassen) und erstellen eine neue Point Variable die wir mit der PointToScreen - Methode der Form die aktuellen XY - Koordinaten der Form zuweisen.

Dann fehlt nurnoch das neuzuweisen der Koordinaten der Form. Diese setzt man per Location Eigenschaft. Dazu rechnen wir einfach die startPoint Eigenschaften mit den endPoint Eigenschaften zusammen.
Startet nun das Projekt und versucht die Form mit gedrückter Mousetaste zu verschieben. Viel Spass.

Veröffentlichen Sie ihre Kommentare ...