MFC 控件随窗口尺寸变化自动调整位置及大小

    在MFC对话框编程过程中经常会出现这样一个问题,在给窗口做尺度变换后,原来的控件位置和大小并没有跟着变,导致界面看起来极不协调,如下:

  

    要解决这个问题,可在类结构体中声明一个CRect变量以存储之前窗体大小的信息,如下:

CRect m_DlgRect;//存储对话框改变前大小,以供计算控件相应位置及大小时使用
    在对话框的构造函数中初始化该变量

m_DlgRect.SetRect(0, 0, 0, 0);//初始化对话框大小存储变量

    在类结构体中声明重绘函数,用于更新控件大小和位置

void repaint(UINT id, int last_Width, int now_Width, int last_Height, int now_Height);

    在cpp中实例化该函数

void CMiniPanoPlayerDlg::repaint(UINT id, int last_Width, int now_Width, int last_Height, int now_Height)//更新控件位置和大小函数,可以根据需要自行修改
{
	CRect rect;
	CWnd *wnd = NULL;
	wnd = GetDlgItem(id);
	if (NULL == wnd)
	{
		MessageBox(_T("相应控件不存在"));
	}
	wnd->GetWindowRect(&rect);
	ScreenToClient(&rect);

	double proportion_x = now_Width / (double)last_Width;
	double proportion_y = now_Height / (double)last_Height;

	rect.left = (long)(rect.left*proportion_x+0.5);
	rect.right = (long)(rect.right*proportion_x + 0.5);
	rect.top = (long)(rect.top *proportion_y + 0.5);
	rect.bottom = (long)(rect.bottom *proportion_y + 0.5);
	wnd->MoveWindow(&rect);
}


    添加对话框消息WM_SIZE的响应函数,如下

void CMFC_SIZE_TESTDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	if (0 == m_DlgRect.left && 0 == m_DlgRect.right
		&& 0 == m_DlgRect.top && 0 == m_DlgRect.bottom)//第一次启动对话框时的大小变化不做处理
	{
	}
	else
	{
		if (0 == cx && 0 == cy)//如果是按下了最小化,则触发条件,这时不保存对话框数据
		{
			return;
		}
		CRect rectDlgChangeSize;
		GetClientRect(&rectDlgChangeSize);//存储对话框大小改变后对话框大小数据

		repaint(IDC_STATIC, m_DlgRect.Width(), rectDlgChangeSize.Width(), m_DlgRect.Height(), rectDlgChangeSize.Height());//重绘函数,用以更新对话框上控件的位置和大小
		repaint(IDOK, m_DlgRect.Width(), rectDlgChangeSize.Width(), m_DlgRect.Height(), rectDlgChangeSize.Height());
		repaint(IDCANCEL, m_DlgRect.Width(), rectDlgChangeSize.Width(), m_DlgRect.Height(), rectDlgChangeSize.Height());
	}
	GetClientRect(&m_DlgRect); //save size of dialog
	Invalidate();//更新窗口
}

    OK,到此完成了所有相关工作,效果如下:





  • 2
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值