In meinen Tests gaben sowohl die Lösungen von Hans Kesting als auch von Fredrik Mörk die gleiche Antwort. Aber:
Ich fand eine interessante Diskrepanz in der Antwort mit den Methoden von Raj More und Hans Kesting und dachte, ich würde teilen. Vielen Dank an beide für ihre Hilfe; Ich kann nicht glauben, dass eine solche Methode nicht in das Framework integriert ist.
Bitte beachten Sie, dass Raj keinen Code geschrieben hat und daher meine Implementierung anders sein könnte als er meinte.
Der Unterschied, den ich fand, war, dass die Methode von Raj More oft zwei Pixel größer war (sowohl in X als auch in Y) als die Methode von Hans Kesting. Ich habe noch nicht festgestellt, warum dies geschieht. Ich bin mir ziemlich sicher, dass es etwas damit zu tun hat, dass der Inhalt einen Zwei-Pixel-Rand zu haben scheint eines Windows-Formulars (wie in den äußersten Rändern des Formulars). Bei meinen Tests, die sicherlich nicht erschöpfend waren, bin ich nur auf verschachtelte Steuerelemente gestoßen. Nicht alle verschachtelten Steuerelemente weisen dies jedoch auf. Zum Beispiel habe ich eine TextBox in einer GroupBox, die die Diskrepanz aufweist, eine Schaltfläche in derselben GroupBox jedoch nicht. Ich kann nicht erklären warum.
Beachten Sie, dass bei äquivalenten Antworten der Punkt (0, 0) innerhalb des oben erwähnten Inhaltsrahmens liegt. Daher glaube ich, dass ich die Lösungen von Hans Kesting und Fredrik Mörk als richtig betrachten werde, aber ich glaube nicht, dass ich der von Raj More implementierten Lösung vertrauen werde.
Ich habe mich auch genau gefragt, welchen Code Raj More geschrieben hätte, da er eine Idee hatte, aber keinen Code zur Verfügung stellte. Ich habe die PointToScreen () -Methode erst vollständig verstanden, als ich diesen Beitrag gelesen habe: http://social.msdn.microsoft.com/Forums/en-US/netfxcompact/thread/aa91d4d8-e106-48d1-8e8a-59579e14f495
Hier ist meine Testmethode. Beachten Sie, dass sich die in den Kommentaren erwähnte Methode 1 geringfügig von der von Hans Kesting unterscheidet.
private Point GetLocationRelativeToForm(Control c)
{
Point controlLocationRelativeToForm1 = new Point();
Control currentControl = c;
while (currentControl.Parent != null)
{
controlLocationRelativeToForm1.Offset(currentControl.Left, currentControl.Top);
currentControl = currentControl.Parent;
}
Point controlScreenPoint = c.PointToScreen(Point.Empty);
Point formScreenPoint = PointToScreen(Point.Empty);
Point controlLocationRelativeToForm2 = controlScreenPoint - new Size(formScreenPoint);
Point locationOnForm = c.FindForm().PointToClient(c.Parent.PointToScreen(c.Location));
Debug.Assert(controlLocationRelativeToForm1 == controlLocationRelativeToForm2);
Debug.Assert(locationOnForm == controlLocationRelativeToForm1);
Debug.Assert(locationOnForm == controlLocationRelativeToForm2);
return controlLocationRelativeToForm1;
}
REAL ABSOULUTE POSITION
stackoverflow.com/questions/4998076/…