【问题标题】:MFC's GetClientRect and MoveWindow don't preserve size?MFC 的 GetClientRect 和 MoveWindow 不保留大小?
【发布时间】:2009-12-15 21:19:49
【问题描述】:

我正在为 Visual Studio 2003 使用 MFC。我有一个 ID 为 IDC_COMMENT_EDIT 的编辑控件。 在下面的代码中,在我第一次调用GetClientRect 之后,我预计rc 的值不会改变。

CWnd* pWnd = GetDlgItem(IDC_COMMENT_EDIT);
if (pWnd != NULL)
{
  RECT rc;
  pWnd->GetClientRect(&rc);
  pWnd->MoveWindow(&rc, TRUE);
  pWnd->GetClientRect(&rc);
}

rc.toprc.left 一直是 0,正如预期的那样。 但是:
第一次拨打GetClientRect 后,我收到rc.bottom == 52rc.right == 575
在第二次调用GetClientRect 后,我得到rc.bottom == 48rc.right == 571

有人知道发生了什么吗?

【问题讨论】:

    标签: visual-c++ mfc visual-studio-2003


    【解决方案1】:

    您对MoveWindow 的调用正在调整大小。您需要使用GetWindowRect 而不是GetClientRect

    客户端矩形只包含client area,它是窗口的非窗口元素(如边框)​​。

    【讨论】:

    • 谢谢,我不知道为什么我的文本框一直在缩小!
    • 没问题,常见问题。这就是命名一个既能移动又能调整 MoveWindow 大小的函数的问题!
    • 更好的名字应该是 AdjustWindowRect
    • 或者他们可以提供一个功能,让您在不调整窗口大小的情况下移动窗口......调整大小和移动似乎与我正交。
    • 函数名没有问题,可以移动窗口的边。很明显,它这样做是因为它给出了一个矩形,而不是一个点。唯一的问题是(是)OP 使用错误的函数来获取窗口的侧面,如果该函数仅更改位置,这仍然是一个问题,因为客户端 rect 的位置不是窗户。 “rc.top and rc.left are 0 all way through”是真的,因为客户端矩形的左上角在客户端坐标中始终是 (0,0),并且 OP 不应该期望它。
    【解决方案2】:

    客户端矩形不包含窗口边框,但 MoveRect 需要一个包含边框的矩形。请改用 GetWindowRect。

    【讨论】:

      猜你喜欢
      • 2015-05-31
      • 2021-04-12
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      相关资源
      最近更新 更多