Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 控制点到客户端()与点到屏幕()的比较_.net_Winforms - Fatal编程技术网

.net 控制点到客户端()与点到屏幕()的比较

.net 控制点到客户端()与点到屏幕()的比较,.net,winforms,.net,Winforms,MSDN没有提供Control.PointToScreen和Control.PointToClient方法之间的明确区别 有没有人能用几句简单的话解释一下这些方法之间的区别。尤其是我不清楚客户的概念 我理解PointToScreen实际屏幕坐标与给定点屏幕左上角的[0,0] 通过示例,调试我所拥有的一些代码 ?click.Location {X = 3 Y = 9} ?shapeSender.PointToClient(click.Location) {X = -470 Y = -565}

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}

谢谢。

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

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


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

假设屏幕为800x600,窗口为50,50,大小为200x200像素。如果点P位于相对于窗口左上角的10,10处,则PointToScreenP将返回60,60。如果这个P被赋予带有窗口句柄的PointToClientP,那么我们将再次得到10,10

希望能消除混淆

PointToClient方法与PointToScreen方法相反

如果不是那么长和重复,它们将被命名为ScreenPointToClientPoint和ClientPointToScreenPoint

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


如果转换客户端区域外的屏幕点,将获得负坐标分量或大于控制客户端区域大小的坐标分量。

最好的方法是:相对坐标与绝对坐标。其中,相对坐标与窗口的工作区左上角相对。窗口的客户区是减去其边框的窗口。相对坐标很有用,因为当用户移动窗口时,它们不会改变,也不依赖于窗口的边框和标题大小

WinForms中的大多数坐标是相对坐标,例如MouseEventArgs.Location。有些是绝对的,比如光标位置。如果您将相对坐标传递给PointToClient,您将得到垃圾,正如您在调试会话中看到的那样。它必须是绝对坐标

某些坐标属性似乎可以是两者兼有,例如Control.Location。在子控件上,它表示控件相对于其容器的位置。表单的位置是绝对的。当您将控件的位置视为相对于控件的父控件时,这种看似矛盾的现象就会消失。窗体的父级是桌面

一种常见用法是将一个控件的坐标映射到另一个控件。首先使用control1.PointToScreen映射到绝对屏幕坐标,然后使用control2.PointToClient将结果映射到另一个控件。无论控件的父控件是谁,点值都会随着控件之间的偏移而更改。以任何其他方式做这件事都是非常痛苦的


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

如果在窗口中,我在面板方法PointToClient[5,5]中的10,10处有一个面板,并且我在面板方法PointToClient[5,5]中调用了按钮5,5,会发生什么情况?有一个被拒绝的消息提到没有名为Mouse.Position的属性。我觉得这是对的。我会应用编辑,但我不知道Winforms,所以我不知道你指的是Control.MousePosition还是Cursor.location我想他们可以称之为PointFromClientToScreen,但那太过分了。因为从屏幕到屏幕的点毫无意义。我不得不删除我以前的评论。注意MouseEventArgs.位置是相对于生成鼠标事件的控件,而不是包含控件的窗体。当我认为我需要使用control.PointToClientform.PointToScreene.Location,而实际上我可以直接使用e.Location时,这让我大吃一惊。