Trong thử nghiệm của tôi, cả hai giải pháp Fredrik Mork của Hans Kesting và đưa ra câu trả lời tương tự. Nhưng:
Tôi đã tìm thấy sự khác biệt thú vị trong câu trả lời bằng cách sử dụng các phương pháp của Raj More và Hans Kesting, và tôi nghĩ rằng tôi sẽ chia sẻ. Nhờ cả hai mặc dù cho sự giúp đỡ của họ; Tôi không thể tin rằng một phương pháp như vậy không được xây dựng trong khuôn khổ.
Xin lưu ý rằng Raj không viết mã và do đó việc triển khai của tôi có thể khác với ý của anh ấy.
Sự khác biệt tôi thấy là phương pháp từ Raj Nhiều hơn thường là hai pixel lớn hơn (trong cả X và Y) so với phương pháp từ Hans Kesting. Tôi chưa xác định tại sao điều này xảy ra. Tôi khá chắc chắn nó có một cái gì đó để làm với thực tế là có vẻ là một biên giới hai pixel xung quanh các nội dung của một hình thức Windows (như trong, bên trong biên giới ngoài cùng của biểu mẫu). Trong thử nghiệm của tôi, mà chắc chắn không phải là đầy đủ ở mức độ nào, tôi đã chỉ đi qua nó trên điều khiển được lồng nhau. Tuy nhiên, không phải tất cả các điều khiển lồng nhau đều thể hiện nó. Ví dụ, tôi có một TextBox bên trong một GroupBox thể hiện sự khác biệt, nhưng một Button bên trong cùng một GroupBox thì không. Tôi không thể giải thích tại sao.
Lưu ý rằng khi câu trả lời tương đương, họ xem điểm (0, 0) là bên trong đường viền nội dung tôi đã đề cập ở trên. Vì vậy, tôi tin rằng tôi sẽ xem xét các giải pháp từ Hans Kesting và Fredrik Mörk là chính xác nhưng không nghĩ rằng tôi sẽ tin tưởng vào giải pháp mà tôi đã thực hiện của Raj More.
Tôi cũng tự hỏi chính xác mã nào Raj More đã viết, vì anh đưa ra ý tưởng nhưng không cung cấp mã.Tôi không hiểu đầy đủ về phương pháp PointToScreen() cho đến khi tôi đọc bài đăng này: http://social.msdn.microsoft.com/Forums/en-US/netfxcompact/thread/aa91d4d8-e106-48d1-8e8a-59579e14f495
Đây là phương pháp thử nghiệm của tôi. Lưu ý rằng 'Phương pháp 1' được đề cập trong các nhận xét hơi khác so với phương pháp của Hans Kesting.
private Point GetLocationRelativeToForm(Control c)
{
// Method 1: walk up the control tree
Point controlLocationRelativeToForm1 = new Point();
Control currentControl = c;
while (currentControl.Parent != null)
{
controlLocationRelativeToForm1.Offset(currentControl.Left, currentControl.Top);
currentControl = currentControl.Parent;
}
// Method 2: determine absolute position on screen of control and form, and calculate difference
Point controlScreenPoint = c.PointToScreen(Point.Empty);
Point formScreenPoint = PointToScreen(Point.Empty);
Point controlLocationRelativeToForm2 = controlScreenPoint - new Size(formScreenPoint);
// Method 3: combine PointToScreen() and PointToClient()
Point locationOnForm = c.FindForm().PointToClient(c.Parent.PointToScreen(c.Location));
// Theoretically they should be the same
Debug.Assert(controlLocationRelativeToForm1 == controlLocationRelativeToForm2);
Debug.Assert(locationOnForm == controlLocationRelativeToForm1);
Debug.Assert(locationOnForm == controlLocationRelativeToForm2);
return controlLocationRelativeToForm1;
}
Nguồn
2010-02-24 18:35:56
Đây là 'REAL ABSOULUTE POSITION' http://stackoverflow.com/questions/4998076/getting-the-location-of-a-control-relative-to-the-entire-screen – PUG
Điều này khác với 'điều khiển như thế nào .PointToScreen (Point.Empty); '? – strongriley
@strongriley Không có ý tưởng (không bao giờ thử nó và không có env dev có sẵn ngay bây giờ), nhưng tôi không thể nhìn thấy hành vi đó được đề cập trong tài liệu, và nếu như vậy không có đảm bảo rằng nó sẽ hoạt động trong phiên bản khuôn khổ trong tương lai. –