如何找到 Win32 控件/窗口相对于其父窗口的位置?

2024-01-05

给定 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(使用前将#替换为@)

如何找到 Win32 控件/窗口相对于其父窗口的位置? 的相关文章

随机推荐