如何找到 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 控件/窗口相对于其父窗口的位置? 的相关文章

  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 使用 Visual C++ 在桌面上绘图

    我正在编写一个 opencv 应用程序 使用 Visual Studio VC 控制台应用程序使用激光束进行绘图 我想在桌面上画线 我知道绘图功能在 GDI32 dll 中可用 但对如何将 GDI32 dll 与我的 vc 代码集成感到困惑
  • 全局拦截窗口移动

    我无法让全局系统挂钩正常工作 我希望在窗口移动时尽早收到通知 并更改窗口大小 这意味着 CBT 钩子HCBT MOVESIZE不会削减它 它只会在窗口移动后发生 我想挂钩窗口的实际移动 并能够在移动过程中更改窗口大小 挂钩是从 DLL 设置
  • EnumDisplayDevices 与 WMI Win32_DesktopMonitor,如何检测活动监视器?

    对于我当前的 C 项目 我需要为在大量计算机上连接并处于活动状态的每个监视器检测一个唯一的字符串 研究指出了两种选择 使用 WMI 并查询 Win32 DesktopMonitor 以获取所有活动监视器 使用 PNPDeviceID 来唯一
  • 使用 SetWindowsHookEx() 阻止窗口鼠标单击

    我编写了一个应用程序 将某些过程挂接到新进程上 以监视鼠标按下事件并禁用新进程上的鼠标按下事件 截至目前 我能够捕获进入此进程的鼠标按下事件 并且我正在尝试将所有鼠标按下事件作为 POC 禁用 这就是我目前在钩子程序中所做的事情 exter
  • InvalidateRect 和 RedrawWindow 的区别

    当我想重绘窗口时 InvalidateRect 和 RedrawWindow 之间是否有首选函数可以调用 例如 这两个调用是否相等 win 将是 HWND RedrawWindow win NULL NULL RDW INVALIDATE
  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • WndProc调用机制(WinAPI)

    我试图了解 Windows 应用程序是如何工作的 有一个WndProc函数 其中发生消息处理 LRESULT CALLBACK WndProc HWND hwnd UINT msg WPARAM wParam LPARAM lParam s
  • 如何在 C++ 中使用 LoadLibrary(..) 调用 kernel32.dll 函数 GetTickCount()

    我正在寻找一个在 Windows 机器上获取以毫秒为单位的时间的函数 本质上 我想调用这个 WinAPI 函数 GetTickCount 但我陷入了 使 用 LoadLibrary n 调用 GetTickCount 函数 部分 我搜索了每
  • 在 Windows Vista 和 Windows 7 上使用 HEAP_NO_SERIALIZE 的堆内存函数速度减慢约 100 倍的原因

    我正在尝试追踪 Windows Vista 和 Windows 7 中堆内存功能的巨大减慢 我没有在任何服务器版本上进行测试 这种情况在 Windows XP 上根本不会发生 只会在 Microsoft 较新的操作系统上发生 我最初在 Wi
  • 从单击的按钮上移除焦点

    当我单击按钮时 焦点将设置到该按钮 如何使用 C 中的 WIN API 移除此按钮的焦点 我想也许以某种方式SendMessageWIN API 方法可以从按钮上移除焦点 我只有按钮的句柄 也无法再访问父窗口 我知道几乎每次都可以使用 Se
  • 了解 GetDiBits。 C++

    MSDN 说位图用于GetDiBits在调用此函数之前不应将其选入 DC 但根据我的经验 与BitBlt 我知道除非选择了位图 否则我无法绘制位图 如何GetDiBits规避这个 我可以只使用未选择的 新创建的位图作为该函数的参数吗 Get
  • 枚举 EMF 时丢失文本

    我在列举发票 emf http www mediafire com kdjwvvo7odyvwa6并将其复制到另一个但文本丢失了 令人惊讶的是 当我将其输出到窗口时 它绘制得非常完美 int CALLBACK EnhMetaFileProc
  • 即使我使用 SetWindowTextW(),Unicode 文本在编辑框中显示为问号

    我遇到了 unicode 文件名在编辑框中显示为问号的问题 当我将 unicode 字符 例如阿拉伯语或泰语 粘贴到编辑框中时 它们会正确显示 但在运行此代码后 它们会变成问号 怎么会 WCHAR buf 100 GetWindowText
  • 设置绝对仓位和保证金

    我想设置一个元素的position to absolute并有一个margin bottom 但似乎margin bottom没有效果 HTML div div CSS container border 1px solid red posi
  • 在 Windows 上使用 C/C++ 开发时省略 msvcr100.dll?

    是否可以在 Windows 上使用 C C 进行开发而不链接到 msvcr100 dll 我知道这是 Windows 的标准 c 库 但我想知道如果我没有安装 Visual Studio 或 Redistributable 软件包 我的计算
  • 如何从 Java 访问 Windows 设备管理器中的信息?

    我有一个串行 USB 设备 并且其中多个设备可以连接到计算机 我需要查询和检索设备连接到的 COM 端口列表 在 Windows 设备管理器中 您可以获得当前连接的设备的 COM 端口 友好名称 该列表是动态的 从注册表中读取不工作 htt
  • 获取Windows下新线程/删除线程的通知

    创建 DLL 时 您可以在 DllMain 函数 DLL THREAD ATTACH DLL THREAD DETACH 中获取有关新线程 退出线程的通知 有没有办法在 非托管 可执行文件中从 Windows 获取这些或等效通知 是的 在您

随机推荐