Control PointToClient()与PointToScreen()

时间:2009-12-16 10:18:15

标签: .net winforms

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}

感谢。

4 个答案:

答案 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方法相反。

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

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

如果转换客户区域外的屏幕点,您将获得负数或大于控制客户区域大小的坐标组件。

答案 2 :(得分:4)

“客户端”坐标相对于控件客户区的左上角。 “屏幕”坐标相对于(主)监视器的左上角。

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

PointToScreen将客户端坐标转换为屏幕坐标。 PointToClient执行相反的操作:它将屏幕坐标转换为客户端坐标。

答案 3 :(得分:3)

假设屏幕为800x600,窗口为50,50,大小为200x200像素。如果点P相对于窗口的左上角位于10,10,则PointToScreen(P)将返回60,60。如果使用窗口句柄将此P赋予PointToClient(P),那么我们将再次获得10,10。

希望清除混乱