2012-04-19 19 views
6

Sto cercando una proprietà che mi dà una posizione di controllo in relazione alla posizione del modulo, non a ClientRectangle's del modulo "0,0".Come ottengo la posizione di un controllo rispetto alla posizione della sua Form?

Ovviamente posso convertire tutto in coordinate dello schermo, ma mi chiedo se c'è un modo più diretto per farlo.

+0

Cosa si intende esattamente per posizione di _control_ è la posizione del cursore che si desidera? – uday

+0

@uDaY Intendo: nelle coordinate dello schermo. Se il modulo è a 100.100 e il controllo è a 150.350, voglio ottenere 50.250. – ispiro

+0

Attenzione: http://stackoverflow.com/questions/8838621/how-to-determine-actual-windows-form-size-with-all-nonclient-elements-when-run –

risposta

2

Sembra che la risposta sia che non esiste un modo diretto per farlo.

(. Come ho detto nella domanda che mi sto cercando un modo altro rispetto all'utilizzo di coordinate dello schermo)

9

È necessario convertire in coordinate dello schermo e quindi eseguire alcuni calcoli matematici.

Point controlLoc = form.PointToScreen(myControl.Location); 

La posizione del modulo è già nelle coordinate dello schermo.

Ora:

Point relativeLoc = new Point(controlLoc.X - form.Location.X, controlLoc.Y - form.Location.Y); 

che vi darà la posizione relativa al nell'angolo superiore sinistro del form, piuttosto che con riferimento al campo client del modulo.

+0

Grazie per la risposta, ma come ho scritto nella domanda sto cercando un modo più diretto di controllare le coordinate dello schermo. – ispiro

+1

@ispiro: non c'è un modo più diretto di incorporare. Si potrebbe facilmente racchiudere quella logica in una piccola funzione che è possibile chiamare. Oppure, quando il modulo viene visualizzato per la prima volta, puoi chiamare 'form.PointToScreen (new Point (0, 0))', salvare il risultato, e quindi aggiungere i valori X e Y al 'Location' del controllo quando vuoi ottieni le coordinate relative alla tua finestra. –

+0

Per quanto riguarda il mio ultimo commento. Intendevo dire che si chiama 'PointToScreen' per ottenere la posizione dell'area client del modulo e sottrarre i valori X e Y della Location per ottenere gli offset. Mi dispiace per quello –

3

Penso che questo risponda alla tua domanda. Nota che "questo" è il modulo.

Rectangle screenCoordinates = control.Parent.ClientToScreen(control.ClientRectangle); 
Rectangle formCoordinates = this.ScreenToClient(screenCoordinates); 
+0

Grazie per la risposta, ma come ho scritto nella domanda sto cercando un modo più diretto di controllare le coordinate dello schermo. – ispiro

+0

+1 per l'input. – ispiro

1

La risposta selezionata viene tecnicamente correggere data la specificità della domanda: tale proprietà fa non esiste nel framework .NET.

Ma se si desidera una tale proprietà, qui è un'estensione di controllo che farà il trucco. Sì, utilizza le coordinate dello schermo, ma data la natura generale del titolo del post, sono sicuro che alcuni utenti che atterrano su questa pagina potrebbero trovare ciò utile.

Incidentalmente, ho passato un paio d'ore a provare a farlo senza le coordinate dello schermo passando in rassegna tutti i genitori di controllo. Non potrei mai ottenere i due metodi per riconciliare. Ciò potrebbe essere dovuto al commento di Hans Passant al PO su come Aero mente le dimensioni della finestra.

using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace Cambia 
{ 
    public static class ControlExtensions 
    { 
     public static Point FormRelativeLocation(this Control control, Form form = null) 
     { 
      if (form == null) 
      { 
       form = control.FindForm(); 
       if (form == null) 
       { 
        throw new Exception("Form not found."); 
       } 
      } 

      Point cScreen = control.PointToScreen(control.Location); 
      Point fScreen = form.Location; 
      Point cFormRel = new Point(cScreen.X - fScreen.X, cScreen.Y - fScreen.Y); 

      return cFormRel; 

     } 

    } 
} 
+1

Questa è un'ottima soluzione. Anche se, credo che intendevi restituire 'cFormRel'. – dshrout

Problemi correlati