MSDN没有提供, Control.PointToScreen (link)和 Control.PointToClient (link)之间的明显区别方法
是否有人可以用一些简单的词语解释这些方法之间的区别。特别是我不清楚“客户”的概念。
我理解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}
感谢。
答案 0 :(得分:41)
最好的方法是:相对vs绝对坐标。相对坐标相对于窗口客户区左上角的位置。窗口的客户区域是一个窗口减去它的边框。相对坐标很有用,因为它们在用户移动窗口时不会改变,并且不依赖于窗口的边框和标题大小。
Winforms中的大多数坐标是相对坐标,例如MouseEventArgs.Location。有些是绝对的,例如Cursor.Position。如果你将相对坐标传递给PointToClient,你会得到垃圾,正如你在调试会话中看到的那样。它必须是绝对坐标。
有些坐标属性看起来似乎都是,例如Control.Location。在子控件上,它表示控件相对于其容器的位置。表格的位置是绝对的。当您将Control.Location视为来自控件的Parent的相对时,看似矛盾就会消失。表单的父级是桌面。
常见的用法是将相对于一个控件的坐标映射到另一个控件。首先使用control1.PointToScreen()
映射到绝对屏幕坐标,然后使用control2.PointToClient()
将结果映射到另一个控件。无论父母是谁,Point值都会根据控件之间的偏移量而变化。以任何其他方式这样做是非常痛苦的。
只需将绝对坐标传递给PointToClient并将相对坐标传递给PointToScreen,即可避免麻烦。
答案 1 :(得分:9)
PointToClient
方法与PointToScreen
方法相反。
(如果不是那么长且重复,它们将被命名为ScreenPointToClientPoint
和ClientPointToScreenPoint
。)
当您拥有一种坐标并需要另一种坐标时,您可以使用转换,例如,如果您有相对于屏幕的鼠标点击坐标,并且需要知道用户点击的控件中的位置。
如果转换客户区域外的屏幕点,您将获得负数或大于控制客户区域大小的坐标组件。
答案 2 :(得分:4)
“客户端”坐标相对于控件客户区的左上角。 “屏幕”坐标相对于(主)监视器的左上角。
“客户区”是可以放置子控件的控件区域。表单的客户端矩形是表单内的区域,不包括边框和标题栏。对于大多数其他控件,客户端区域与控件在屏幕上占据的区域相同。
PointToScreen
将客户端坐标转换为屏幕坐标。 PointToClient
执行相反的操作:它将屏幕坐标转换为客户端坐标。
答案 3 :(得分:3)
假设屏幕为800x600,窗口为50,50,大小为200x200像素。如果点P相对于窗口的左上角位于10,10,则PointToScreen(P)将返回60,60。如果使用窗口句柄将此P赋予PointToClient(P),那么我们将再次获得10,10。
希望清除混乱