Подтвердить что ты не робот

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}

Спасибо.

4b9b3361

Ответ 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.

Надеюсь, что очистит путаницу