2023年4月25日,周二晚上。
今天查了不少关于CRect类及其相关内容的资料,学到了不少东西,所以我决定写一篇详细的关于CRect类及其相关内容的文章,以记录今天所学。
CRect类
在 MFC 中,CRect 类表示一个矩形区域。它是一个包含左上角坐标和右下角坐标的简单类。
CRect 包含以下四个成员变量:
- int left:矩形区域左上角的 x 坐标。
- int top:矩形区域左上角的 y 坐标。
- int right:矩形区域右下角的 x 坐标。
- int bottom:矩形区域右下角的 y 坐标。
在MFC中,CRect类表示矩形的坐标是相对于窗口客户区的左上角,也就是说原点在客户区的左上角。
如果你通过下面这段代码获取到了上面这个窗口的客户区的CRect
CRect rc;
GetClientRect(rc);
那么你实际上,获得的是下面A、B这两点的坐标
所以,此时rc的四个成员变量的值为:
- rc.left=0
- rc.top=0
- rc.right=500
- rc.bottom=300
CRect类的运用
CRect可以和MoveWindows搭配使用,来设置父窗口中客户区的子窗口的位置和大小。
这这里我只是说明大致的思路和需要注意的地方,下面的代码并不能单独运行。
int CMultiWinTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
//获取当前窗口的客户区大小
CRect rc;
GetClientRect(rc);
dlg1 = new CDlg1();
//以IDD_DIALOG1窗口为模版创建子窗口,并放入父窗口,this在这里指代父类窗口
dlg1->Create(IDD_DIALOG1, this);
dlg1->MoveWindow(0, 0,rc.right,rc.bottom);
dlg1->ShowWindow(SW_SHOW);
return 0;
}
首先,先用GetClientRect来获取父窗口客户区的大小
CRect rc;
GetClientRect(rc);
然后,用Create函数,以IDD_DIALOG1窗口为模版创建子窗口,并放入父窗口,this在这里指代父类窗口
dlg1 = new CDlg1();
dlg1->Create(IDD_DIALOG1, this);
在这里简单说一下Create函数:
BOOL Create(UINT nIDTemplate, CWnd* pParentWnd = NULL);
- 参数 nIDTemplate:UINT 类型的资源 ID 号,用于指定要使用的对话框模板;
- 参数 pParentWnd:CWnd 指针,指向包含该对话框的父级窗口。
然后,用MoveWindow函数设置子窗口的位置和大小,注意这个位置是相对于父窗口客户区的左上角来说的
dlg1->MoveWindow(0, 0,rc.right,rc.bottom);
这句代码的意思是,把子窗口移到坐标为(0,0)的地方,子窗口的宽度设置为rc.right、高度设置为rc.bottom
在这样我要特别说一句,那就是父窗口大小和子窗口大小的关系:
如果父窗口的客户区比要设置的子窗口更小,则会截取掉子窗口超过父窗口客户区大小的部分。如果父窗口的客户区比要设置的子窗口更大,则子窗口将被设置在父窗口客户区左上角,而且这样会使子窗口无法填满整个客户区,因此父窗口中剩余的部分将保持空白。
现在我会给出图片说明。
首先给你们看看子窗口是什么样的:
父窗口的客户区比要设置的子窗口更小:
可以看到少了一个按钮...
父窗口的客户区比要设置的子窗口更大
可以看到有很多空白的地方...