给定 Win32 窗口的句柄,我需要找到它相对于其父窗口的位置。
我知道几个功能(例如;GetWindowRect() http://msdn.microsoft.com/en-us/library/windows/desktop/ms633519%28v=vs.85%29.aspx and GetClientRect() http://msdn.microsoft.com/en-us/library/windows/desktop/ms633503%28v=vs.85%29.aspx),但它们都没有明确返回所需的坐标。
我该怎么做呢?
解决方案是利用综合力量GetWindowRect()
and MapWindowPoints() http://msdn.microsoft.com/en-us/library/windows/desktop/dd145046%28v=vs.85%29.aspx.
GetWindowRect()
检索窗口相对于您在监视器上看到的整个屏幕区域的坐标。我们需要将这些绝对坐标转换为主窗口区域的相对坐标。这MapWindowPoints()
将给定的相对于一个窗口的坐标转换为相对于另一个窗口的坐标。因此,我们需要屏幕区域的“句柄”以及我们试图查找其坐标的控件的父窗口的句柄。屏幕是 Windows 术语中的“窗口”,称为“桌面”。我们可以通过常量访问Desktop的句柄HWND_DESKTOP
定义于WinUser.h
(包括Windows.h
足够的)。我们只需调用 Win32 函数即可获取父窗口的句柄GetParent() http://msdn.microsoft.com/en-us/library/windows/desktop/ms633510%28v=vs.85%29.aspx。现在我们已经有了调用所需的所有参数MapWindowPoints()
功能。
RECT YourClass::GetLocalCoordinates(HWND hWnd) const
{
RECT Rect;
GetWindowRect(hWnd, &Rect);
MapWindowPoints(HWND_DESKTOP, GetParent(hWnd), (LPPOINT) &Rect, 2);
return Rect;
}
MapWindowPoints()
定义为:
int MapWindowPoints(
_In_ HWND hWndFrom,
_In_ HWND hWndTo,
_Inout_ LPPOINT lpPoints,
_In_ UINT cPoints
);
MapWindowPoints()
相对变换坐标hWndFrom
to hWndTo
。在我们的例子中,我们从桌面进行转换(HWND_DESKTOP
)到我们的父窗口(GetParent(hWnd)
)。因此,由此产生的RECT
结构体保存子窗口的相对坐标(hWnd
) 相对于其父窗口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)