MFC CWnd高度和宽度

Fra*_*tal 2 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)
Run Code Online (Sandbox Code Playgroud)

这个LPRECT是什么?我已经有了对象...为什么以及GetWindowRect中的参数是什么?我指的是什么?我已经有了想要找到尺寸的物体......只要给我一个尺寸.

Cod*_*ray 6

该LPRECT参数是指向RECT结构的指针("LP"前缀实际上代表"长指针",由于历史原因).

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

值得一提的是,API接受指向RECT结构的指针,以便与Win32完全兼容.该CRectMFC类实际上是继承从RECT被SDK中定义的结构,所以可以使用CRect交替这里对象.这很好,因为CRect提供了更容易操作矩形的成员函数.

示例代码:

CWnd* pwndParent = this->GetParent();

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

// rc now contains the rectangle of your window!
Run Code Online (Sandbox Code Playgroud)

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

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

CWnd* pwndParent = this->GetParent();

RECT rcClient;
pwndParent->GetClientRect(&rcClient);
Run Code Online (Sandbox Code Playgroud)


Mar*_*ica 6

答案是你用的GetWindowRect.

CWnd* parent = this->GetParent();
CRect size;
parent->GetWindowRect(&size);
Run Code Online (Sandbox Code Playgroud)

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

  1. MFC 很老了(比我怀疑读的这个人要老一些).在那些日子里,编译器无法按值处理返回结构.从那时起"向后兼容".
  2. MFC是(或至少,最初是)一个非常薄的Windows API函数包装器.