Control PointToClient()与PointToScreen()

ser*_*hio 30 .net winforms

恕我直言,MSDN没有提供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}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Han*_*ant 43

最好的方法是:相对vs绝对坐标.相对坐标相对于窗口客户区左上角的位置.窗口的客户区域是一个窗口减去它的边框.相对坐标很有用,因为它们在用户移动窗口时不会改变,并且不依赖于窗口的边框和标题大小.

Winforms中的大多数坐标是相对坐标,例如MouseEventArgs.Location.有些是绝对的,例如Cursor.Position.如果你将相对坐标传递给PointToClient,你会得到垃圾,正如你在调试会话中看到的那样.它必须是绝对坐标.

一些坐标属性看起来似乎都是,例如Control.Location.在子控件上,它表示控件相对于其容器的位置.表格的位置是绝对的.当您将Control.Location视为来自控件的Parent的相对时,看似矛盾就会消失.表单的父级是桌面.

常见的用法是将相对于一个控件的坐标映射到另一个控件.首先映射到绝对屏幕坐标control1.PointToScreen(),然后将结果映射到其他控件control2.PointToClient().无论父母是谁,Point值都会根据控件之间的偏移量而变化.以任何其他方式做它是非常痛苦的.

只需将绝对坐标传递给PointToClient并将相对坐标传递给PointToScreen,即可避免麻烦.


Guf*_*ffa 9

PointToClient方法与该PointToScreen方法相反.

(如果它不是那么长,重复,它们将被命名为ScreenPointToClientPointClientPointToScreenPoint.)

当您有一种坐标并且需要另一种坐标时,您可以使用转换,例如,如果您有相对于屏幕的鼠标点击坐标,并且需要知道用户单击控件的位置.

如果转换客户区域外的屏幕点,则会得到负数或大于控制客户区域大小的坐标组件.


Tho*_*mas 6

“客户”坐标相对于控件客户区域的左上角。“屏幕”坐标相对于(主)显示器的左上角。

“客户区”是可以放置子控件的控件区域。窗体的客户矩形是窗体内部的区域,不包括边框和标题栏。对于大多数其他控件,客户区与控件在屏幕上占据的区域相同。

PointToScreen将客户端坐标转换为屏幕坐标。PointToClient则相反:它将屏幕坐标转换为客户端坐标。