MFC控件随对话框放大缩小自适应变化(此方法会使控件等比例变化,需要保留原大小详见另一篇)

注意:此方法会使控件等比例变化,导致失真等问题,需要保留控件原始大小详见另一篇MFC控件缩放

首先启用对话框的最大最小属性。

随后在对话框的头文件.h中定义两个成员变量用于保存界面数据

POINT m_pointOld;
CRect m_Rect

然后在对话框的初始化函数OnInitDialog中赋与成员变量界面数据初值。禁用调整大小,因为手动调整大小计算方法还不会。。。。。

    GetClientRect(&m_rectInitial);  //获取对话框的大小
	ModifyStyle(WS_THICKFRAME, 0);//禁用调整大小
	GetClientRect(&m_Rect);
	m_pointOld.x = m_Rect.right - m_Rect.left;
	m_pointOld.y = m_Rect.bottom - m_Rect.top;

然后添加界面的OnSize函数,在这个函数中写入如下即可满足最大化时控件自适应,

void CxxxDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialog::OnSize(nType, cx, cy);
	// TODO: Add your message handler code here
	if (nType==SIZE_RESTORED||nType==SIZE_MAXIMIZED)	//判断窗口是不是最小化了,因为窗口最小化之后,窗口的长和宽会变为0,这样造成除以0的错误
	{
		float fsp[2];
		POINT NewP;		//获取现在对话框的大小
		CRect new_rect;
		GetClientRect(&new_rect);
		NewP.x = new_rect.right - new_rect.left;
		NewP.y = new_rect.bottom - new_rect.top;

		if (m_pointOld.x == 0.0 || m_pointOld.y == 0.0)
		{
			return ;
		}

		fsp[0] = (float)NewP.x / m_pointOld.x;
		fsp[1] = (float)NewP.y / m_pointOld.y;

		CRect Rect;
		int woc;
		CPoint OldTLPoint, TLPoint;//左上角
		CPoint OldBRPoint, BRPoint;//右下角

		HWND hWndChild = ::GetWindow(m_hWnd, GW_CHILD);	//列出所有控件
		while(hWndChild)
		{
			woc = ::GetDlgCtrlID(hWndChild);	//取得ID
			GetDlgItem(woc)->GetWindowRect(Rect);
			ScreenToClient(Rect);

			OldTLPoint = Rect.TopLeft();
			TLPoint.x = (long)(OldTLPoint.x*fsp[0]);
			TLPoint.y = (long)(OldTLPoint.y*fsp[1]);

			OldBRPoint = Rect.BottomRight();
			BRPoint.x = (long)(OldBRPoint.x*fsp[0]);
			BRPoint.y = (long)(OldBRPoint.y*fsp[1]);

			Rect.SetRect(TLPoint, BRPoint);
			GetDlgItem(woc)->MoveWindow(Rect, TRUE);
			hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT);
		}
		m_pointOld = NewP;
	}
}

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值