VS2010 MFC 控件随主框体变化而变化

这里介绍一种控制控件随主框体变化而变化的方法。
方法并不完善,框体只支持最大化和最小化窗口时还好,但是在连续最大化最小化切换10次以上以后,控件在主框体中的相对位置会向左上角移动,幅度并不大,基本可以满足应用需要;
但如果主框体动态的变化大小,控件的相对位置变化的非常快,基本不能使用。
自己使用MFC只是做一些小工具,或者测试工具,自己或者同事使用,只使用最大化和最小化窗口,基本也满足需要了。
下面介绍方法:
1、在对话框类中添加成员变量 CRect m_rectOrg 它是用来记录当前对话框的大小。
在OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rectOrg )。
2、在对话框类中添加函数void ChangeSize(CWnd * pWnd, int cx, int cy),根据主框体的变化改变控件大小。

void CTESTDlg::ChangeSize(CWnd * pWnd, int cx, int cy)
{
	if (pWnd)
	{
		CRect rect; 
		pWnd->GetWindowRect(&rect);				//获取控件变化前的大小
		ScreenToClient(&rect);					//将控件大小转换为在对话框中的区域坐标 
		rect.left=rect.left*cx/m_rectOrg.Width();		//调整控件大小 ,cx/m_rectOrg.Width()为对话框在横向的变化比例
		rect.right=rect.right*cx/m_rectOrg.Width();		//cx存储的是变化后的宽度,cy存储的是变化后的高度
		rect.top=rect.top*cy/m_rectOrg.Height();		//m_rectOrg.height()表示的是变化前主窗体的高度
		rect.bottom=rect.bottom*cy/m_rectOrg.Height();
		pWnd->MoveWindow(rect);					//设置控件大小
	}
}

3、在MFC 类向导中添加消息WM_SIZE,如下图所示:
在这里插入图片描述
4、修改void CTESTDlg::OnSize(UINT nType, int cx, int cy)

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

	// TODO: 在此处添加消息处理程序代码

	if(nType==SIZE_MINIMIZED) return; //最小化则什么都不做 
	CWnd *pWnd;		
	int ctrlID;
	HWND hWndChild = ::GetWindow(m_hWnd, GW_CHILD);	//列出所有控件
	while(hWndChild)
	{
		ctrlID= ::GetDlgCtrlID(hWndChild);
		pWnd = GetDlgItem(ctrlID); //获取控件句柄
		ChangeSize(pWnd,cx,cy);
		hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT);
	}
	GetClientRect(&m_rectOrg);
}

猜你喜欢

转载自blog.csdn.net/ShiJian_ShaLou/article/details/84939347