Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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
C# 调用PointToScreen与CompositionTarget.TransformToDevice时的不同答案_C#_Wpf_User Interface_Coordinates_Coordinate Transformation - Fatal编程技术网

C# 调用PointToScreen与CompositionTarget.TransformToDevice时的不同答案

C# 调用PointToScreen与CompositionTarget.TransformToDevice时的不同答案,c#,wpf,user-interface,coordinates,coordinate-transformation,C#,Wpf,User Interface,Coordinates,Coordinate Transformation,我有一个WPF窗口,位于主(也是唯一)屏幕的左上角。我想将窗口中的点(0,0)转换为屏幕坐标。我相信以下两个电话会给我同样的结果: 1。这将导致(8,8). window.PointToScreen(new Point(0,0)); PresentationSource.FromVisual(window).CompositionTarget.TransformToDevice.Transform(new Point(0,0)); 2。这将导致(0,0). window.PointToScr

我有一个WPF窗口,位于主(也是唯一)屏幕的左上角。我想将窗口中的点(0,0)转换为屏幕坐标。我相信以下两个电话会给我同样的结果:

1。这将导致(8,8).

window.PointToScreen(new Point(0,0));
PresentationSource.FromVisual(window).CompositionTarget.TransformToDevice.Transform(new Point(0,0));
2。这将导致(0,0).

window.PointToScreen(new Point(0,0));
PresentationSource.FromVisual(window).CompositionTarget.TransformToDevice.Transform(new Point(0,0));
为什么?

8像素的差异表明,第一个调用将窗口坐标系视为在边框之后开始,而第二个调用将窗口视为一个整体,包括非客户端区域(调整边框和工具栏的大小)。这是真的吗

(经过编辑以删除有关DPI设置的多余细节)

您了解客户区,对吗

第一个调用很有用,若你们想找出子对象的位置,放在窗口的位置(0,0),它将是客户端区域内的一个点。窗口边框(不要与
边框混用)不是客户区域


在我看来,第二个调用是窗口本身的坐标(包括边框)。

这很有道理,是的。我试图使用call 1,但我在尝试从SystemParameters补偿边框宽度等时陷入了困境。正如您所说,调用2返回窗口句柄本身的限制,包括所有非客户端区域的内容。非常感谢。我认为这个答案的最后一句是错的。TransformToDevice仅包含监视器的DPI比例因子,因此(0,0)始终转换为(0,0)。它不计算逻辑坐标(0,0)的屏幕坐标。如果我错了,请纠正我。我试图获取窗口左上角的屏幕坐标,但使用(0,0)时,它不起作用。@Lumo,不确定你有什么问题,也许值得问一个新问题?操作代码类似于。