MFC的GetClientRect和MoveWindow无法保持大小?

4

我正在使用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
请问有人知道发生了什么吗?
2个回答

7
你调用的 MoveWindow 函数正在进行调整大小。你需要使用 GetWindowRect 函数,而不是 GetClientRect 函数。

客户区域只包括窗口的非窗口元素(例如边框)。


谢谢,我没想明白为什么我的文本框一直在缩小! - des4maisons
没问题,常见问题。这就是给一个既移动又调整大小的函数命名为MoveWindow所带来的问题! - Brian R. Bondy
一个更好的名称应该是像AdjustWindowRect这样的内容。 - Brian R. Bondy
或者他们可以提供一个函数,让你在不调整大小的情况下移动窗口... 调整大小和移动看起来有些互相独立。 - des4maisons
函数名称移动窗口的边缘没有问题,因为它显然是给定一个矩形而不是点。唯一的问题是(曾经)OP使用了错误的函数来获取窗口的边缘,即使该函数仅更改位置,这仍将是一个问题,因为客户端矩形的位置不是窗口的位置。 "rc.top和rc.left始终为0"是正确的,因为客户端矩形的左上角在客户端坐标中始终为(0,0),OP不应该期望它有其他值。 - Jim Balter

4

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接