MFC CWnd 高度和宽度

MFC CWnd height and width

如何获取 CWnd* 的高度和宽度? CWnd 是 window 正确吗?为什么不是命令:

CWnd* parent = this->GetParent(); // C++ command
parent->GetSize(); // what I think the method should be OR ...
parent->GetWindowRect(); // what i think it should be (no arguments)

这是什么LPRECT?我已经有了这个对象……为什么以及进入 GetWindowRect 的参数是什么?我指的是什么?我已经有了要查找大小的对象...只需给我大小即可。

LPRECT 参数是指向 RECT structure 的指针(由于历史原因,"LP" 前缀实际上代表 "long pointer")。

GetWindowRect function 将为您的 CWnd object 检索 window 矩形,但它将通过填充 RECT 来实现具有这些坐标的结构。因此,您需要创建一个 RECT 结构并将指向它的指针传递给 GetWindowRect 函数。

值得一提的是,API 接受指向 RECT 结构的指针,以便与 Win32 完全兼容。 CRect MFC class实际上继承了SDK定义的RECT结构,所以这里可以交替使用CRectobject。这很好,因为 CRect 提供了成员函数,可以更轻松地操作矩形。

示例代码:

CWnd* pwndParent = this->GetParent();

CRect rc;
pwndParent->GetWindowRect(&rc);

// rc now contains the rectangle of your window!

请注意,GetWindowRect 函数将 return 您的 window 的 屏幕 坐标。这通常不是您想要的,除非您试图在屏幕上重新定位 window。屏幕坐标很难使用,因为它们是相对于整个虚拟屏幕的,在 multi-monitor 配置中可以有负坐标。此外,如果您尝试使用其屏幕坐标确定 window 的大小,您将在屏幕上获得 window 的整个大小,包括其 non-client 区域(如标题栏、min/max/close 按钮等)。

您通常想要的是 window 的 客户端 坐标,可以通过以相同方式调用 GetClientRect function 来检索。这次,我们将使用 RECT 结构,因为我们可以:

CWnd* pwndParent = this->GetParent();

RECT rcClient;
pwndParent->GetClientRect(&rcClient);

好的,我想出了我相信的答案。任何想知道的人都在这里...

CRect rc_total_window;
this->GetWindowRect(rc_total_window);

其中 'this' 是一个 CWnd* 对象。再次感谢所有的历史和解释。它有助于了解事情为什么会这样,这样您就可以确定自己没有做错什么;当方法与现代语言课程中学到的不同时,尤其有用。

答案是你使用GetWindowRect

CWnd* parent = this->GetParent();
CRect size;
parent->GetWindowRect(&size);

如果你问为什么这样做,我可以想到两个答案:

  1. MFC 非常 很旧(我怀疑比某些读这篇文章的人更老)。在那些日子里,编译器无法按值处理返回结构。从此"backwards compatability".
  2. MFC 是(或者至少,最初是)对 Windows API 函数的非常 的薄包装。