Лучший способ думать об этом: относительные или абсолютные координаты. Где относительная координата является относительной от верхнего левого угла клиентской области окна. Клиентская область окна - это окно без его границы. Относительные координаты полезны, потому что они не меняются, когда пользователь перемещает окно, и не зависят от границы и размера заголовка окна.
Большинство координат в Winforms являются относительными координатами, например MouseEventArgs.Location. Некоторые являются абсолютными, например, Cursor.Position. Если вы передадите относительную координату в PointToClient, вы получите мусор, как вы видели в сеансе отладки. Это должна быть абсолютная координата.
Некоторые свойства координат, по-видимому, могут быть обоими, например Control.Location. На дочернем элементе управления он представляет местоположение элемента управления относительно его контейнера. Расположение формы является абсолютным. Это кажущееся противоречие исчезает, когда вы думаете, что Control.Location относительно родительского элемента управления. Родителем формы является рабочий стол.
Обычно используется для сопоставления координат относительно одного элемента управления другому элементу управления. Сначала сопоставьте абсолютные координаты экрана с помощью control1.PointToScreen()
, затем сопоставьте результат с другим элементом управления с помощью control2.PointToClient()
. Значение Point изменяется смещением между элементами управления, независимо от того, кто их родители. Делать это любым другим способом очень больно.
Избегайте неприятностей, передавая только абсолютную координату PointToClient и относительную координату PointToScreen.