2009-12-16 8 views
29

MSDN non fornisce, IMHO, una chiara differenza tra Control.PointToScreen (link) e Control.PointToClient (link) metodi.controllo PointToClient() vs PointToScreen()

C'è qualcuno che potrebbe spiegare in poche semplici parole qual è la differenza tra questi metodi. Soprattutto non è chiaro per me la nozione di "Cliente".

Capisco PointToScreen la coordinata schermo reale (con [0, 0] nell'angolo in alto a sinistra dello schermo) del punto specificato.

Per esempio, il debug di un certo codice che ho

?click.Location 
{X = 3 Y = 9} 

?shapeSender.PointToClient(click.Location) 
{X = -470 Y = -565} 

?shapeSender.PointToScreen(click.Location) 
{X = 476 Y = 583} 

Grazie.

risposta

40

Il modo migliore per pensarci è: coordinate relative rispetto all'assoluzione. Dove la coordinata relativa è relativa dall'angolo in alto a sinistra dell'area client di una finestra. L'area client di una finestra è una finestra meno il suo bordo. Le coordinate relative sono utili perché non cambiano quando l'utente sposta una finestra e non dipendono dalla dimensione del bordo e della didascalia della finestra.

La maggior parte delle coordinate in Winforms sono coordinate relative, ad esempio MouseEventArgs.Location. Alcuni sono assoluti, Cursor.Position per esempio. Se si passa una coordinata relativa a PointToClient si otterrà spazzatura, come si è visto nella sessione di debug. Deve essere una coordinata assoluta.

Alcuni coordinata proprietà possono essere sia apparentemente, Control.Location per esempio. Su un controllo figlio rappresenta la posizione relativa del controllo dal suo contenitore. La posizione di una form è assoluta. Quella apparente contraddizione scompare quando si pensa che una Posizione di controllo sia relativa rispetto al Genitore di un controllo. Il genitore di un modulo è il desktop.

Un uso comune è mappare una coordinata relativa ad un controllo a un altro controllo. Prima mappare a coordinate schermo assolute con control1.PointToScreen(), quindi mappare il risultato all'altro controllo con control2.PointToClient(). Il valore del Punto cambia in base all'offset tra i controlli, indipendentemente da chi siano i loro genitori. Farlo in un altro modo è molto doloroso.

Tenere fuori guai sempre e solo passando una coordinata assoluta di PointToClient e coordinate relative alla PointToScreen.

+0

C'era una (rifiutata) [modifica suggerita] (http://stackoverflow.com/review/suggested-edits/2557841) che indica che non esiste una proprietà denominata 'Mouse.Position'. Questo mi sembra corretto. Applicherei la modifica ma non conosco le Winforms quindi non so se intendi "Control.MousePosition" o "Cursor.Location' – doubleDown

+0

Suppongo che avrebbero potuto chiamarlo PointFromClientToScreen ma è eccessivo. Poichè PointFromScreenToScreen non ha senso. –

+0

Ho dovuto cancellare il mio commento precedente. * * * Fornisce le coordinate dello schermo. –

4

Le coordinate "client" sono relative alla parte superiore sinistra dell'area client di un controllo. Le coordinate "schermo" sono relative alla parte superiore sinistra del monitor (principale).

"area client" è l'area di un controllo in cui è possibile posizionare i controlli figlio. Il rettangolo client di un modulo è l'area all'interno del modulo, esclusi i bordi e la barra del titolo. Per la maggior parte degli altri controlli, l'area client è uguale all'area che il controllo occupa sullo schermo.

PointToScreen converte le coordinate del client in coordinate dello schermo. PointToClient esegue il contrario: converte le coordinate dello schermo in coordinate del cliente.

3

Supponiamo che uno schermo sia 800x600 e una finestra sia 50,50 con una dimensione di 200x200 pixel. Se il punto P si trova a 10,10 rispetto alla finestra in alto a sinistra, allora PointToScreen (P) restituirà 60,60. Se questa P viene data a PointToClient (P) con il manico della finestra, otterremo di nuovo 10,10.

speranza che cancella la confusione

+0

E se nella finestra ho un pannello a 10, 10 e io chiamo un pulsante (a 5, 5 nel pannello) Metodo PointToClient ([5, 5])? – serhio

9

Il metodo PointToClient è l'inverso del metodo PointToScreen.

(Se non fosse così a lungo e ripetitivo, sarebbero stati chiamati ScreenPointToClientPoint e ClientPointToScreenPoint.)

si utilizza il conversioni quando si dispone di un tipo di coordinate e hanno bisogno l'altro, ad esempio se avete la le coordinate di un clic del mouse relative allo schermo e devono sapere in che punto del controllo l'utente ha fatto clic.

Se si converte un punto dello schermo esterno all'area del client, si ottengono componenti di coordinate negativi o maggiori delle dimensioni dell'area del client di controllo.

Problemi correlati