MFC之CRect详解

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

在这样我要特别说一句,那就是父窗口大小和子窗口大小的关系:

如果父窗口的客户区比要设置的子窗口更小,则会截取掉子窗口超过父窗口客户区大小的部分。如果父窗口的客户区比要设置的子窗口更大,则子窗口将被设置在父窗口客户区左上角,而且这样会使子窗口无法填满整个客户区,因此父窗口中剩余的部分将保持空白。

现在我会给出图片说明。

首先给你们看看子窗口是什么样的:

 

父窗口的客户区比要设置的子窗口更小:

可以看到少了一个按钮...

父窗口的客户区比要设置的子窗口更大

可以看到有很多空白的地方...

 

 

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巨龙之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值