C# 将System.Windows.Rect强制转换为System.Windows.Point

C# 将System.Windows.Rect强制转换为System.Windows.Point,c#,c++,winapi,point,rect,C#,C++,Winapi,Point,Rect,我想在C++中转换这个C++代码:< /p> RECT电流; ::GetWindowRect(hwndChild和rcCurrent); ::MapWindowPoints(NULL、hWnd、重新解释强制转换(&rcCurrent),2) 但我不知道如何转变: reinterpret\u cast(&rcCurrent) 如何将System.Windows.Rect转换为System.Windows.Point?哇,这真是对重新解释转换的滥用!代码的基本意思是:取一个指向包含4个整数的内存段的

我想在C++中转换这个C++代码:< /p>
RECT电流;
::GetWindowRect(hwndChild和rcCurrent);
::MapWindowPoints(NULL、hWnd、重新解释强制转换(&rcCurrent),2)

但我不知道如何转变:

reinterpret\u cast(&rcCurrent)


如何将System.Windows.Rect转换为System.Windows.Point?

哇,这真是对
重新解释转换的滥用!代码的基本意思是:取一个指向包含4个整数的内存段的指针,并假设它实际上是指向包含2个整数的内存段的指针。它假设左上角的点坐标首先存储在矩形内,并且两种类型都具有兼容的内存布局和字节对齐(这是一个非常合理的假设,但不能保证)

在C#中最安全的做法是手动将所需的值从
Rect
复制到
对象,例如

var point = new Point(rect.x, rect.y);
更新:

更易于维护的选项(谢谢Sven!):

…您可以使用此版本映射单个点(始终以1的形式传递cPoints)。然后,还可以定义与RECT一起使用的版本:

[DllImport("user32.dll", SetLastError=true)]
public static extern int MapWindowPoints(IntPtr hwndFrom, IntPtr hwndTo, ref RECT lpPoints, [MarshalAs(UnmanagedType.U4)] int cPoints);

调用后一个版本时,请始终将cPoints作为2传入。调用这个函数将是原始的C++ MPEWLDOWPONT调用的精确的C等价物。< /P>你希望它们如何转换?一个描述矩形,另一个描述点。在实际情况下,该点应该从矩形中描述什么?如果没有这些信息,就不可能说出您可能希望如何映射它们。它不仅比原来的
reinterpret_cast
(不依赖于内存布局)更安全,而且更具语义,更易读,因此更易于维护;这里发生的事情是,代码使用强制转换来处理一个RECT,它是4个整数{top,left,bottom,right};好像它的两个点-{top,left}和{bottom,right}。这是因为两者是如何定义的。这是一种老式的Win32习惯用法,虽然这可能不是很好的通用C用法,但由于Win32 API要求POINT/RECT具有这些特定的二进制布局,因此可以保证它在Win32上工作。但还是很难看:)
RECT rcCurrent; ::GetWindowRect ( hwndChild, &rcCurrent );
::MapWindowPoints ( NULL, hWnd, reinterpret_cast<LPPOINT>(&rcCurrent), 2);
[DllImport("user32.dll", SetLastError=true)]
public static extern int MapWindowPoints(IntPtr hwndFrom, IntPtr hwndTo, ref POINT lpPoints, [MarshalAs(UnmanagedType.U4)] int cPoints);
[DllImport("user32.dll", SetLastError=true)]
public static extern int MapWindowPoints(IntPtr hwndFrom, IntPtr hwndTo, ref RECT lpPoints, [MarshalAs(UnmanagedType.U4)] int cPoints);