2012-12-17 7 views
8

Ho creato una classe che consente all'utente di trascinare i pannelli su un modulo. Come posso garantire che l'utente non metta due pannelli uno sopra l'altro? Se lo fanno, vorrei spostare/evidenziare uno dei controlli mentre sono entrambi sovrapposti.Come verificare se due controlli si sovrappongono in Windows Form

Ho provato a impostarlo nell'evento OnMouseDown ma non ha funzionato.

Inoltre, il numero di pannelli nel modulo varia a seconda del numero di immagini che il modulo deve mostrare. Ogni pannello ha una picturebox all'interno del pannello.

+0

Si può provare a controllare tutti i pannelli esistenti, se la posizione di caduta del nuovo pannello è coperta da quella già esistente. Devi solo un po 'di matematica con la posizione e le dimensioni dei controlli. – sgud

risposta

1

Quindi sono stato in grado di risolvere questa domanda con l'aiuto del suggerimento di sgud.

Il trucco era utilizzare il metodo Rectangle.Intersect all'interno dell'evento OnMouseUp generato.

Ecco l'intuizione che ho usato dietro. (potrebbe non essere la soluzione migliore)

1) Creare un elenco di tutti i controlli all'interno del mio pannello principale.

2) Attraversare i controlli e creare un elenco di tutti i limiti di rettangolo per ciascun controllo. è possibile ottenere questo controllo.Bounds

3) Passare attraverso l'elenco di Limiti e intersecarlo con il limite dell'elemento attualmente attivo.
Se il rettangolo restituito ha altezza e larghezza uguali a quello del controllo attivo, assegnare la modifica alla proprietà back color.

Spero che questo aiuta a chiunque altro che ha un problema simile

7

Un approccio molto migliore è quello di utilizzare il metodo Rectangle.Bounds.IntersectsWith, che fa il controllo per voi e in grado di produrre codice più pulito. Personalmente non sono a conoscenza di problemi o benefici in termini di prestazioni, in un modo o nell'altro, anche se vorrei azzardare un'ipotesi che semplicemente il looping sui controlli e il loro controllo con questo sarebbe più veloce della creazione di elenchi e cicli.

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

Spero che questo aiuti, anche se hai fatto questa domanda qualche tempo fa.

+0

Ho cercato questa funzione e sembra che funzionerà. Tuttavia, non lavoro più su questo progetto, quindi non sarei in grado di provarlo. Grazie comunque. –