MFC CWnd高度和宽度

时间:2016-02-04 15:21:07

标签: c++ mfc cwnd

如何获得CWnd *的高度和宽度? CWnd窗口是否正确?为什么不是命令:

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中的参数是什么?我指的是什么?我已经有了想要找到尺寸的物体......只要给我一个尺寸。

3 个答案:

答案 0 :(得分:6)

答案是你使用GetWindowRect

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

如果您要求为什么这样做,我可以想到两个答案:

  1. MFC 非常旧(比我怀疑阅读此内容的人更早)。在那些日子里,编译器无法按值处理返回结构。从那时起“向后兼容”。
  2. MFC是(或至少,最初是)基于Windows API函数的非常瘦包装器。

答案 1 :(得分:5)

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

GetWindowRect function将检索CWnd对象的窗口矩形,但是它会通过使用这些坐标填充RECT结构来实现。因此,您需要创建一个RECT结构并将指针传递给GetWindowRect函数。

值得一提的是,API接受指向RECT结构的指针,以便与Win32完全兼容。 CRect MFC class实际从SDK定义的RECT结构继承,因此您可以在此处互换使用CRect对象。这很好,因为CRect提供了更容易操作矩形的成员函数。

示例代码:

CWnd* pwndParent = this->GetParent();

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

// rc now contains the rectangle of your window!

请注意,GetWindowRect函数将返回窗口的屏幕坐标。这通常不是您想要的,除非您尝试在屏幕上重新定位窗口。屏幕坐标很难处理,因为它们相对于整个虚拟屏幕,在多显示器配置中可能具有负坐标。此外,如果您尝试使用其屏幕坐标确定窗口的大小,您将获得屏幕上窗口的整个大小,包括其非客户区域(如标题栏,最小/最大/关闭按钮)等等。)。

您通常需要的是窗口的 client 坐标,可通过以相同方式调用GetClientRect function来检索。这一次,我们将使用RECT结构,因为我们可以:

CWnd* pwndParent = this->GetParent();

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

答案 2 :(得分:0)

好吧,我相信我找到了答案。这里适合任何想要知道的人......

CRect rc_total_window;
this->GetWindowRect(rc_total_window);

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