Control PointToClient () против PointToScreen () - PullRequest
30 голосов
/ 16 декабря 2009

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}

Спасибо.

Ответы [ 4 ]

41 голосов
/ 16 декабря 2009

Лучший способ думать об этом: относительные или абсолютные координаты. Где относительная координата является относительной от верхнего левого угла клиентской области окна. Клиентская область окна - это окно без его границы. Относительные координаты полезны, потому что они не меняются, когда пользователь перемещает окно, и не зависят от границы и размера заголовка окна.

Большинство координат в Winforms являются относительными координатами, например MouseEventArgs.Location. Некоторые являются абсолютными, например, Cursor.Position. Если вы передадите относительную координату в PointToClient, вы получите мусор, как вы видели в сеансе отладки. Это должна быть абсолютная координата.

Некоторые свойства координат, по-видимому, могут быть обоими, например Control.Location. На дочернем элементе управления он представляет местоположение элемента управления относительно его контейнера. Расположение формы является абсолютным. Это кажущееся противоречие исчезает, когда вы думаете, что Control.Location относительно родительского элемента управления. Родителем формы является рабочий стол.

Обычно используется для сопоставления координат относительно одного элемента управления другому элементу управления. Сначала сопоставьте абсолютные координаты экрана с помощью control1.PointToScreen(), затем сопоставьте результат с другим элементом управления с помощью control2.PointToClient(). Значение Point изменяется смещением между элементами управления, независимо от того, кто их родители. Делать это любым другим способом очень больно.

Избегайте неприятностей, передавая только абсолютную координату PointToClient и относительную координату PointToScreen.

9 голосов
/ 16 декабря 2009

Метод PointToClient противоположен методу PointToScreen.

(Если бы оно не было таким длинным и повторяющимся, их назвали бы ScreenPointToClientPoint и ClientPointToScreenPoint.)

Преобразования используются, когда у вас есть один тип координат, а вам нужен другой, например, если у вас есть координаты щелчка мыши относительно экрана и вам нужно знать, где в элементе управления пользователь щелкнул.

Если вы преобразуете точку экрана, находящуюся за пределами клиентской области, вы получите координаты, отрицательные или превышающие размер контрольной клиентской области.

4 голосов
/ 16 декабря 2009

Координаты "клиента" относятся к верхнему левому углу клиентской области элемента управления. Координаты «экрана» относятся к верхнему левому углу (основного) монитора.

«Клиентская область» - это область элемента управления, в которую можно поместить дочерние элементы управления. Клиентский прямоугольник формы - это область внутри формы, исключая границы и строку заголовка. Для большинства других элементов управления клиентская область совпадает с областью, которую элемент управления занимает на экране.

PointToScreen преобразует клиентские координаты в экранные координаты. PointToClient делает наоборот: он преобразует экранные координаты в клиентские координаты.

3 голосов
/ 16 декабря 2009

Предположим, экран имеет размер 800x600, а окно имеет размер 50,50 и размер 200x200 пикселей. Если точка P лежит на 10,10 относительно верхнего левого угла окна, PointToScreen (P) вернет 60,60. Если этот P передается PointToClient (P) с дескриптором окна, то мы снова получим 10,10.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...