开发者

Control PointToClient() vs PointToScreen()

The MSDN does not provide, IMHO, a clear difference between Control.PointToScreen(link) and Control.PointToClient(link) methods.

Is there somebody w开发者_开发技巧ho could explain in a few simple words what is the difference between these methods. Especially is unclear for me the notion of "Client".

I understand PointToScreen the real screen coordinate (with [0, 0] in the left upper corner of the screen) of the given point.

By example, debugging some code I have

?click.Location 
{X = 3 Y = 9}

?shapeSender.PointToClient(click.Location)
{X = -470 Y = -565}

?shapeSender.PointToScreen(click.Location)
{X = 476 Y = 583}

Thanks.


Best way to think of it is: relative vs absolute coordinates. Where the relative coordinate is relative from the upper left corner of the client area of a window. The client area of a window is a window minus its border. Relative coordinates are useful because they don't change when the user moves a window and don't depend on the border and caption size of the window.

Most coordinates in WinForms are relative coordinates, MouseEventArgs.Location for example. Some are absolute, Cursor.Position for example. If you pass a relative coordinate to PointToClient you'll get garbage, as you saw in your debug session. It must be an absolute coordinate.

Some coordinate properties can seemingly be both, Control.Location for example. On a child control it represents the control's location relative from its container. A form's Location is absolute. That seeming contradiction disappears when you think a Control.Location as relative from a control's Parent. The Parent of a form is the desktop.

A common usage is to map a coordinate relative to one control to another control. First map to absolute screen coordinates with control1.PointToScreen(), then map the result to the other control with control2.PointToClient(). The Point value changes by the offset between the controls, regardless of who their parents are. Doing it any other way is very painful.

Keep out of trouble by only ever passing an absolute coordinate to PointToClient and a relative coordinate to PointToScreen.


The PointToClient method is the reverse of the PointToScreen method.

(If it wasn't so long and repetitive, they would be named ScreenPointToClientPoint and ClientPointToScreenPoint.)

You use the conversions when you have one kind of coordinates and need the other, for example if you have the coordinates of a mouse click relative to the screen, and need to know where in the control the user clicked.

If you convert a screen point that is outside the client area, you will get coordinate components that are either negative or larger than the size of the control client area.


The "client" coordinates are relative to the top left of a control's client area. The "screen" coordinates are relative to the top left of the (primary) monitor.

The "client area" is the area of a control in which child controls can be placed. The client rectangle of a form is the area inside the form, excluding the borders and title bar. For most other controls, the client area is the same as the area that the control occupies on the screen.

PointToScreen converts client coordinates to screen coordinates. PointToClient does the reverse: it converts screen coordinates to client coordinates.


Suppose a screen is 800x600 and a window is at 50,50 having a size of 200x200 pixels. If the point P lies at 10,10 relative to the window's upper-left then PointToScreen(P) will return 60,60. If this P is given to PointToClient(P) with the window handle then we will get 10,10 again.

Hope that clears the confusion

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜