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.
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
Ich vermutete, sie hätten es PointFromClientToScreen nennen können, aber das ist übertrieben. Da macht PointFromScreenToScreen einfach keinen Sinn. –
Ich musste meinen vorherigen Kommentar löschen. Es * gibt * Bildschirmkoordinaten. –