Win32中的窗口边框宽度和高度 - 我如何获得它?

新手上路,请多包涵
      ::GetSystemMetrics (SM_CYBORDER)

…返回 1,我知道标题栏比一个像素高:/

我也试过:

     矩形 r;
      r.left = r.top = 0; r.right = r.bottom = 400;
      ::AdjustWindowRect (& r, WS_OVERLAPPED, FALSE);
      _bdW = (uword)(r.right - r.left - 400);
      _bdH = (uword)(r.bottom - r.top - 400);

但是边界 w,h 回到 0。

在我的 WM_SIZE 处理程序中,我需要确保窗口的高度以“步长”变化,例如,一个全新的文本行可以适合窗口,底部没有“垃圾部分行空间”。

但是 ::MoveWindow 需要添加边框空间的尺寸。

以前一定有人这样做过…感谢您的帮助:)

原文由 Stephen Hazel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

GetWindowRectGetClientRect 函数可用于计算所有窗口边框的大小。

Suite101 有一篇关于 调整窗口大小和将客户区保持在已知大小 的文章。

这是他们的示例代码:

 void ClientResize(HWND hWnd, int nWidth, int nHeight)
{
  RECT rcClient, rcWind;
  POINT ptDiff;
  GetClientRect(hWnd, &rcClient);
  GetWindowRect(hWnd, &rcWind);
  ptDiff.x = (rcWind.right - rcWind.left) - rcClient.right;
  ptDiff.y = (rcWind.bottom - rcWind.top) - rcClient.bottom;
  MoveWindow(hWnd,rcWind.left, rcWind.top, nWidth + ptDiff.x, nHeight + ptDiff.y, TRUE);
}

原文由 stukelly 发布,翻译遵循 CC BY-SA 3.0 许可协议

GetWindowInfo 函数能够返回给定窗口的边框宽度和高度。

cxWindowBorders 成员获取垂直边框宽度,而 cyWindowBorders 获取水平边框高度。

这也提供了 这个答案 的评论中提到的调整边框的值,这台机器上的值是 7px,在其他机器上可能会有所不同。因此,在进一步的测试中,检索到的成员值似乎只符合窗口的 一个 边框,而不是两者。

原文由 Laurie Stearn 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题