2012-12-17 7 views
8

Ich habe eine Klasse erstellt, die es dem Benutzer ermöglicht, Felder in einem Formular zu ziehen. Wie kann ich sicherstellen, , dass der Benutzer nicht zwei Platten übereinander platziert? Wenn dies der Fall ist, möchte ich eines der Steuerelemente verschieben/hervorheben, während beide überlappt sind.Überprüfen, ob sich zwei Steuerelemente in Windows Forms überlappen

Ich habe versucht, dies in OnMouseDown-Ereignis zu setzen, aber das hat nicht ganz funktioniert.

Außerdem hängt die Anzahl der Felder auf dem Formular von der Anzahl der Bilder ab, die das Formular anzeigen muss. Jedes Panel hat eine Bildbox im Panel.

+0

Sie können versuchen, alle vorhandenen Panels zu überprüfen, wenn der Ablegeort des neuen Panels von einem bereits vorhandenen Panel abgedeckt wird. Sie müssen nur etwas Mathe mit Standort und Größen der Kontrollen haben. – sgud

Antwort

1

Also konnte ich diese Frage mit Hilfe von sguds Vorschlag lösen.

Der Trick war Rectangle.Intersect Methode innerhalb OnMouseUp Ereignis ausgelöst.

Hier ist die Intuition, die ich dahinter verwendet habe. (es ist vielleicht nicht die beste Lösung)

1) Erstellen Sie eine Liste aller Steuerelemente in meinem Hauptfenster.

2) Navigieren Sie durch die Steuerelemente und erstellen Sie eine Liste aller Rectangle Bounds für jedes Steuerelement. Sie können dies durch control.Bounds

3) Gehen Sie durch die Liste der Grenzen und schneiden Sie es mit dem aktuellen aktiven Element gebunden.
Wenn das zurückgegebene Rechteck die gleiche Höhe und Breite wie das aktive Steuerelement aufweist, dann ändern Sie die Eigenschaft für die Hintergrundfarbe.

Ich hoffe, das hilft, alle anderen, dass ein ähnliches Problem

7

Ein viel besserer Ansatz ist es zu verwenden, um die Rectangle.Bounds.IntersectsWith Methode haben, die die Prüfung für Sie tut und kann saubereren Code erzeugen. Mir persönlich sind keine Leistungsprobleme oder Vorteile auf die eine oder andere Weise bekannt, obwohl ich annehmen würde, dass das einfache Umkehren der Steuerelemente und deren Überprüfung schneller wäre als das Erstellen von Listen und Schleifen.

Picturebox pic = new Picturebox(); 
foreach(Control picturebox in Form1){ 
    if (pic.Bounds.IntersectsWith(picturebox.Bounds)) 
    { 
     //We have a problem, Houston, because we just collided! 
    } 
} 

Ich hoffe, dass dies hilft, obwohl Sie diese Frage vor einiger Zeit gestellt haben.

+0

Ich habe diese Funktion nachgeschlagen und sieht so aus, als würde es funktionieren. Ich arbeite jedoch nicht mehr an diesem Projekt und könnte es nicht mehr testen. Trotzdem danke. –