2009-12-16 8 views
29

Die MSDN bietet keine, IMHO, einen klaren Unterschied zwischen Control.PointToScreen (link) und Control.PointToClient (link) Methoden.Steuerung PointToClient() vs PointToScreen()

Gibt es jemanden, der mit ein paar einfachen Worten erklären könnte, worin der Unterschied zwischen diesen Methoden besteht? Insbesondere ist für mich der Begriff "Kunde" unklar.

Ich verstehe PointSoScreen die reale Bildschirmkoordinate (mit [0, 0] in der linken oberen Ecke des Bildschirms) des gegebenen Punktes.

von Beispiel Debuggen einige Code Ich habe

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

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

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

Dank.

Antwort

40

Der beste Weg, um es zu denken ist: relative vs Absolution Koordinaten. Die relative Koordinate ist relativ zur oberen linken Ecke des Clientbereichs eines Fensters. Der Client-Bereich eines Fensters ist ein Fenster ohne seinen Rahmen. Relative Koordinaten sind nützlich, da sie sich nicht ändern, wenn der Benutzer ein Fenster bewegt und nicht von der Rahmen- und Beschriftungsgröße des Fensters abhängig ist.

Die meisten Koordinaten in Winforms sind relative Koordinaten, zum Beispiel MouseEventArgs.Location. Einige sind absolute, Cursor.Position zum Beispiel. Wenn Sie eine relative Koordinate an PointToClient übergeben, erhalten Sie Müll, wie Sie in Ihrer Debug-Sitzung gesehen haben. Es muss eine absolute Koordinate sein.

Einige Koordinateneigenschaften können scheinbar beide sein, Control.Location zum Beispiel. Auf einem untergeordneten Steuerelement wird die Position des Steuerelements relativ zu seinem Container dargestellt. Die Position eines Formulars ist absolut. Dieser scheinbare Widerspruch verschwindet, wenn Sie einen Control.Location als relativ vom Elternelement eines Controls halten. Der Eltern eines Formulars ist der Desktop.

Eine häufige Verwendung besteht darin, eine Koordinate relativ zu einem Steuerelement einem anderen Steuerelement zuzuordnen. Stellen Sie zuerst die absoluten Bildschirmkoordinaten mit control1.PointToScreen() ab und ordnen Sie das Ergebnis dann dem anderen Steuerelement mit control2.PointToClient() zu. Der Point-Wert ändert sich um den Offset zwischen den Steuerelementen, unabhängig davon, wer ihre Eltern sind. Es ist sehr schmerzhaft, es auf andere Weise zu tun.

Vermeiden Sie Probleme, indem Sie immer nur eine absolute Koordinate an PointToClient und eine relative Koordinate an PointToScreen übergeben.

+0

Es gab eine (abgelehnte) [vorgeschlagene Bearbeitung] (http://stackoverflow.com/review/suggested-edits/2557841), die erwähnt, dass es keine Eigenschaft namens 'Mouse.Position' gibt. Das scheint mir richtig zu sein. Ich würde die Bearbeitung anwenden, aber ich kenne Winforms nicht, also weiß ich nicht, ob Sie 'Control.MousePosition' oder' Cursor.Location' meinen. – doubleDown

+0

Ich vermutete, sie hätten es PointFromClientToScreen nennen können, aber das ist übertrieben. Da macht PointFromScreenToScreen einfach keinen Sinn. –

+0

Ich musste meinen vorherigen Kommentar löschen. Es * gibt * Bildschirmkoordinaten. –

4

Die "Client" -Koordinaten sind relativ zum oberen linken Bereich des Clientbereichs eines Steuerelements. Die "Bildschirm" -Koordinaten sind relativ zum oberen linken Rand des (primären) Monitors.

Der "Clientbereich" ist der Bereich eines Steuerelements, in dem untergeordnete Steuerelemente platziert werden können. Das Clientrechteck eines Formulars ist der Bereich innerhalb des Formulars, mit Ausnahme der Rahmen und der Titelleiste. Bei den meisten anderen Steuerelementen entspricht der Clientbereich dem Bereich, den das Steuerelement auf dem Bildschirm belegt.

PointToScreen konvertiert Clientkoordinaten in Bildschirmkoordinaten. PointToClient macht das Gegenteil: es konvertiert Bildschirmkoordinaten in Clientkoordinaten.

3

Angenommen, ein Bildschirm ist 800x600 und ein Fenster ist bei 50,50 mit einer Größe von 200x200 Pixel. Wenn der Punkt P bei 10,10 relativ zur linken oberen Ecke des Fensters liegt, gibt PointToScreen (P) 60,60 zurück. Wenn dieses P an PointToClient (P) mit dem Fensterhandle übergeben wird, erhalten wir wieder 10,10.

Hoffnung, dass die Verwirrung

+0

Was ist, wenn im Fenster ich ein Panel bei 10, 10 habe und ich einen Button (bei 5, 5 im Panel) Methode PointToClient ([5, 5]) aufrufen? – serhio

9

Die PointToClient Methode löscht ist die Umkehrung der PointToScreen Methode.

(Wenn es nicht so lange und sich wiederholende war, würden sie ScreenPointToClientPoint und ClientPointToScreenPoint genannt werden.)

Sie die Konvertierungen verwenden, wenn Sie eine Art von Koordinaten haben und müssen das andere, zum Beispiel, wenn Sie das haben Koordinaten eines Mausklicks relativ zum Bildschirm und müssen wissen, wo der Benutzer in der Steuerung geklickt hat.

Wenn Sie einen Bildschirmpunkt außerhalb des Clientbereichs konvertieren, erhalten Sie Koordinatenkomponenten, die entweder negativ oder größer als die Größe des Steuerclientbereichs sind.