MapWindowPoints 函数 (winuser.h)
MapWindowPoints 函数将 (映射) 一组点从相对于一个窗口的坐标空间转换为相对于另一个窗口的坐标空间。
语法
int MapWindowPoints(
[in] HWND hWndFrom,
[in] HWND hWndTo,
[in, out] LPPOINT lpPoints,
[in] UINT cPoints
);
参数
[in] hWndFrom
从中转换点的窗口的句柄。 如果此参数为 NULL 或HWND_DESKTOP,则假定这些点位于屏幕坐标中。
[in] hWndTo
指向要向其转换点的窗口的句柄。 如果此参数为 NULL 或HWND_DESKTOP,则点将转换为屏幕坐标。
[in, out] lpPoints
指向 POINT 结构的数组的指针,该数组包含要转换的点集。 这些点以设备单位为单位。 此参数还可以指向 RECT 结构,在这种情况下, cPoints 参数应设置为 2。
[in] cPoints
lpPoints 参数指向的数组中的 POINT 结构数。
返回值
如果函数成功,则返回值的低序字是添加到每个源点的水平坐标以计算每个目标点的水平坐标的像素数。 (除此之外,如果正对 hWndFrom 和 hWndTo 之一进行镜像,则每个生成的水平坐标乘以 -1.) 高序字是添加到每个源点垂直坐标的像素数,以便计算每个目标点的垂直坐标。
如果函数失败,则返回值为零。 在调用此方法之前调用 SetLastError ,以将错误返回值与合法的“0”返回值区分开来。
注解
如果 hWndFrom 或 hWndTo (或两者) 都是镜像窗口, (即,具有 WS_EX_LAYOUTRTL 扩展样式) 且在 lpPoints 中准确传递两个点, 则 MapWindowPoints 会将这两个点解释为 RECT ,并可能自动交换该矩形的左右字段,以确保左侧不大于右侧。 如果在 lpPoints 中传递了除 2 以外的任意数量的点,则 MapWindowPoints 将分别正确映射其中每个点的坐标,因此,如果将指针传入到 lpPoint 中多个矩形的数组,则新矩形的左字段可能大于右侧。 因此,若要保证矩形坐标的正确转换,必须一次使用一个 RECT 指针调用 MapWindowPoints,如以下示例所示:
RECT rc[10];
for(int i = 0; i < (sizeof(rc)/sizeof(rc[0])); i++)
{
MapWindowPoints(hWnd1, hWnd2, (LPPOINT)(&rc[i]), (sizeof(RECT)/sizeof(POINT)) );
}
此外,如果需要精确映射两个独立点,并且不希望 MapWindowPoints 对其应用 RECT 逻辑,若要保证正确结果,则必须使用一次一个 POINT 指针调用 MapWindowPoints,如以下示例所示:
POINT pt[2];
MapWindowPoints(hWnd1, hWnd2, &pt[0], 1);
MapWindowPoints(hWnd1, hWnd2, &pt[1], 1);
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | winuser.h (包括 Windows.h) |
Library | User32.lib |
DLL | User32.dll |
API 集 | 在 Windows 10 版本 10.0.10240 中引入的 ext-ms-win-ntuser-window-l1-1-2 () |