2009-12-16 2 views
29

MSDN от не обеспечивает, ИМХО, четкое различие между Control.PointToScreen (link) и Control.PointToClient (link) методы.управления PointToClient() против PointToScreen()

Есть ли кто-нибудь, кто мог бы объяснить несколькими простыми словами, в чем разница между этими методами. Особенно для меня непонятно понятие «клиент».

Я понимаю 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} 

Спасибо.

ответ

40

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

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

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

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

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

+0

Было (отклонено) [предлагаемое редактирование] (http://stackoverflow.com/review/spected-edits/2557841), в котором упоминается, что нет свойства с именем 'Mouse.Position'. Это кажется мне правильным. Я бы применил редактирование, но я не знаю Winforms, поэтому я не знаю, имеете ли вы «Control.MousePosition» или «Cursor.Location» – doubleDown

+0

Я предположил, что они могли бы назвать его PointFromClientToScreen, но это слишком много. Поскольку PointFromScreenToScreen просто не имеет смысла. –

+0

Мне пришлось удалить свой предыдущий комментарий. Он * дает * координаты экрана. –

4

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

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

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

3

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

Надежда, что очищает путанице

+0

Что делать, если в окне у меня есть панель в 10, 10, и я вызываю кнопку (на 5, 5 в панели) метод PointToClient ([5, 5])? – serhio

9

PointToClient метод является обратным методом PointToScreen.

(если это не было так долго, и повторы, они будут названы ScreenPointToClientPoint и ClientPointToScreenPoint.)

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

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

Смежные вопросы