3

如何获得 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 的参数是什么?我指的是什么?我已经有了我想要找到大小的对象......只要给我大小。

4

3 回答 3

8

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

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

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

示例代码:

CWnd* pwndParent = this->GetParent();

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

// rc now contains the rectangle of your window!

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

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

CWnd* pwndParent = this->GetParent();

RECT rcClient;
pwndParent->GetClientRect(&rcClient);
于 2016-02-04T15:27:42.887 回答
6

答案是你使用GetWindowRect.

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

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

  1. MFC 已经老了(我怀疑比某些阅读本文的人还要老)。在那些日子里,编译器无法按值处理返回的结构。从此“向后兼容”。
  2. MFC 是(或至少最初是)Windows API 函数的一个非常薄的包装器。
于 2016-02-04T15:28:07.913 回答
0

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

CRect rc_total_window;
this->GetWindowRect(rc_total_window);

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

于 2016-02-04T15:27:56.243 回答