Control PointToClient() vs PointToScreen()
MSDN не предоставляет IMHO четкую разницу между Control.PointToScreen (ссылка) и Control.PointToClient (ссылка).
Есть ли кто-нибудь, кто мог бы объяснить несколькими простыми словами, в чем разница между этими методами. Особенно для меня непонятно понятие "клиент".
Я понимаю PointToScreen реальную координату экрана (с [0, 0] в левом верхнем углу экрана) данной точки.
Например, отладка какого-либо кода у меня есть
?click.Location
{X = 3 Y = 9}
?shapeSender.PointToClient(click.Location)
{X = -470 Y = -565}
?shapeSender.PointToScreen(click.Location)
{X = 476 Y = 583}
Спасибо.
Ответы
Ответ 1
Лучший способ подумать об этом: относительные против абсольских координат. Если относительная координата относительна относительно верхнего левого угла клиентской области окна. Клиентская область окна - это окно за вычетом границы. Относительные координаты полезны, потому что они не меняются, когда пользователь перемещает окно и не зависит от размера границы и заголовка окна.
Большинство координат в Winforms являются относительными координатами, например MouseEventArgs.Location. Некоторые из них являются абсолютными, например Cursor.Position. Если вы передадите относительную координату PointToClient, вы получите мусор, как вы видели в своем отладочном сеансе. Это должна быть абсолютная координата.
Некоторые свойства координат могут выглядеть как, например, Control.Location. В дочернем контроле он представляет собой местоположение управления относительно его контейнера. Место формы является абсолютным. Это кажущееся противоречие исчезает, когда вы думаете, что Control.Location является относительным от контрольного родителя. Родитель формы - это рабочий стол.
Обычно используется сопоставление координат относительно одного элемента управления другому элементу управления. Сначала сопоставьте абсолютные координаты экрана с control1.PointToScreen()
, затем сопоставьте результат с другим элементом управления с помощью control2.PointToClient()
. Значение Point изменяется за счет смещения между элементами управления, независимо от того, кто их родители. Сделать это любым другим способом очень больно.
Сохраняйте проблемы, только передавая абсолютную координату PointToClient и относительную координату с PointToScreen.
Ответ 2
Метод PointToClient
является обратным методу PointToScreen
.
(Если бы это было не так долго и повторяемо, они были бы названы ScreenPointToClientPoint
и ClientPointToScreenPoint
.)
Вы используете преобразования, когда у вас есть один вид координат, и нужен другой, например, если у вас есть координаты щелчка мыши относительно экрана, и вам нужно знать, где в элементе управления щелкнул пользователь.
Если вы преобразуете точку экрана, находящуюся за пределами клиентской области, вы получите координатные компоненты, которые являются либо отрицательными, либо большими, чем размер клиентской области управления.
Ответ 3
Координаты "клиента" относятся к левому верхнему углу клиентской области управления. Координаты "экрана" относятся к левому верхнему углу (первичного) монитора.
"Клиентская область" - это область элемента управления, в котором могут быть установлены дочерние элементы управления. Клиентский прямоугольник формы - это область внутри формы, исключая границы и заголовок. Для большинства других элементов управления клиентская область такая же, как область, которую элемент управления занимает на экране.
PointToScreen
преобразует координаты клиента в координаты экрана. PointToClient
делает обратное: он преобразует координаты экрана в координаты клиента.
Ответ 4
Предположим, что экран 800x600, а окно - 50,50, размер которого составляет 200x200 пикселей. Если точка P лежит на 10,10 относительно окна в верхнем левом углу, то PointToScreen (P) вернет 60,60. Если этот P задан PointToClient (P) с помощью дескриптора окна, мы снова получим 10,10.
Надеюсь, что очистит путаницу