【问题标题】:How to get coordinates of window client area如何获取窗口客户区的坐标
【发布时间】:2011-03-15 14:39:24
【问题描述】:

我可以使用 GetClientRect 和 GetWindowRect Win32 调用来获取整个窗口区域的坐标,以及客户区域的坐标。我的问题是 GetClientRect 总是为左上角返回 0,0。如何确定实际客户区域与窗口矩形的关系?

【问题讨论】:

  • 如果您使用的是 WinForms(并且根据下面的 cmets,看起来您是),您不应该为此使用 PInvoke。使用Control.ClientRectangleControl.Bounds
  • 我需要使用 PInvoke,因为我正在另一个应用程序中获取窗口的坐标。

标签: c# winapi


【解决方案1】:

您可以使用ClientToScreen 获取屏幕坐标中左上角(0,0) 点的坐标。 GetClientRect 返回的 RECT 将适合您获取右下角(只需添加到 ClientToScreen 设置的 POINT)。

【讨论】:

  • 我不明白为什么这是一个公认的答案。这将客户端矩形映射到屏幕矩形。该问题要求相对于窗口矩形的客户端矩形(在 Win32 中,它是包含所有窗口边框/修剪的矩形,位于客户端矩形之外。)
  • 答案是正确的。 WindowRect 已经在绝对屏幕坐标中。使用 ClientToScreen() 或 MapWindowPoints() 将 ClientRect(其左上角位于 0,0)映射到屏幕坐标后,它们都在屏幕坐标中。
【解决方案2】:

使用 ClientToScreen 将客户端坐标转换为屏幕坐标。窗口矩形(GetWindowRect)已经在屏幕坐标中,并且包括非客户区(边框、标题等)

【讨论】:

  • 这是我遗漏的关键部分; 并包括非客户区(边框、标题等)。谢谢!
【解决方案3】:

如果您使用的是 WinForms,那么您可以使用 PointToScreen 而不是 ClientToScreen 来解决 Reed Copsey 提出的解决方案。

【讨论】:

    【解决方案4】:

    使用AdjustWindowRectEx() 最容易找到窗口矩形(带边框等)和客户端矩形(内边框)之间的关系。获取窗口的样式和前样式,调用该函数,查看每边有多少边框。

    【讨论】:

      【解决方案5】:

      您还可以使用MapWindowPoints 函数一次将整个 RECT 转换为屏幕坐标。

      【讨论】:

      • 这可以在Control.RectangleToScreen 及其表亲Control.RectangleToClient 找到。
      猜你喜欢
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      相关资源
      最近更新 更多