Лучший способ подумать об этом: относительные против абсольских координат. Если относительная координата относительна относительно верхнего левого угла клиентской области окна. Клиентская область окна - это окно за вычетом границы. Относительные координаты полезны, потому что они не меняются, когда пользователь перемещает окно и не зависит от размера границы и заголовка окна.
Большинство координат в Winforms являются относительными координатами, MouseEventArgs.Location например. Некоторые из них являются абсолютными, например Cursor.Position. Если вы передадите относительную координату PointToClient, вы получите мусор, как вы видели в своем отладочном сеансе. Это должна быть абсолютная координата.
Некоторые свойства координат могут выглядеть как, например, Control.Location. В дочернем контроле он представляет местоположение элемента управления относительно его контейнера. Расположение формы является абсолютным. Это кажущееся противоречие исчезает, когда вы считаете Control.Location относительным от родителя элемента управления. Родитель формы - это рабочий стол.
Общее использование заключается в том, чтобы сопоставить координату относительно одного элемента управления другому элементу управления. Сначала сопоставьте абсолютные координаты экрана с control1.PointToScreen()
, затем сопоставьте результат с другим элементом управления с помощью control2.PointToClient()
. Значение Point изменяется за счет смещения между элементами управления, независимо от того, кто их родители. Сделать это любым другим способом очень больно.
Не допускайте попадания в беду, только передавая абсолютную координату PointToClient и относительную координату к PointToScreen.
Было (отклонено) [предлагаемое редактирование] (http://stackoverflow.com/review/spected-edits/2557841), в котором упоминается, что нет свойства с именем 'Mouse.Position'. Это кажется мне правильным. Я бы применил редактирование, но я не знаю Winforms, поэтому я не знаю, имеете ли вы «Control.MousePosition» или «Cursor.Location» – doubleDown
Я предположил, что они могли бы назвать его PointFromClientToScreen, но это слишком много. Поскольку PointFromScreenToScreen просто не имеет смысла. –
Мне пришлось удалить свой предыдущий комментарий. Он * дает * координаты экрана. –