MFC窗口大小最大化最小化随拖动调整大小

通常我们的MFC窗口默认是没有可以选择的最大化和最小化,开发用户可以选择支持最大化,最小化属性功能.

选择需要支持的对话框属性,开启Title Bar功能,开启System Menu ,Maximize Box ,Minimize box功能,这样我们的主界面就可以支持最大化,最小化,同时Border属性设置为Resizing模式,可以拖动改变大小.

在这里插入图片描述
定义一个类对象变量
CList<CRect, CRect&> m_listRect;
CRect m_DlgRect;
int m_buttonID;
BOOL m_iniFinish;
在CPP中现实累的初始化,获取子窗口区域.

CRect rect;
m_listRect.RemoveAll();
GetWindowRect(&rect);
m_listRect.AddTail(rect);//对话框的区域  

CWnd* pWnd = GetWindow(GW_CHILD);//获取子窗体  
while (pWnd)
{
	pWnd->GetWindowRect(rect);//子窗体的区域  
	m_listRect.AddTail(rect);           //CList<CRect,CRect> m_listRect成员变量  
	pWnd = pWnd->GetNextWindow();//取下一个子窗体  
}
//重绘上次保存的窗口数据
MoveWindow(m_DlgRect.left,m_DlgRect.top,m_DlgRect.Width(),m_DlgRect.Height(),TRUE);

m_wndIninFished=TRUE;

重载两个消息函数
ON_WM_SIZE()
ON_WM_GETMINMAXINFO()
///重载消息函数
void CXXXX::OnSize(UINT nType, int cx, int cy)
{
CDialog:OnSize(nType, cx, cy);

 ChangeAllWnd();

}

void CXXXX::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
// TODO: Add your message handler code here and/or call default
if (lpMMI->ptMinTrackSize.x <= 1024)
lpMMI->ptMinTrackSize.x = 1024;
if (lpMMI->ptMinTrackSize.y <= 768)
lpMMI->ptMinTrackSize.y = 748;

int cx = GetSystemMetrics(SM_CXFULLSCREEN);
int cy = GetSystemMetrics(SM_CYFULLSCREEN);

/*窗口最大值*/
if (lpMMI->ptMaxTrackSize.x >= cx)
	lpMMI->ptMaxTrackSize.x = cx-2;
if (lpMMI->ptMaxTrackSize.y >= cy)
	lpMMI->ptMaxTrackSize.y = cy-2;

CDialog::OnGetMinMaxInfo(lpMMI);

}
用来盖改变窗体大小,并记录窗口信息,退出时候保存,下次加载时候自动恢复上次保存的窗口大小.
void CXXXX::SaveMainWindow()
{
GetClientRect(&m_DlgRect); //save size of dialog
int t,b,l,r;
t= m_DlgRect.top;
b=m_DlgRect.bottom;
l=m_DlgRect.left;
r=m_DlgRect.right;

::IniWriteInt(_T(“MainWnd”), _T(“Top”), t, GetAbsolutePathName(CFG));
::IniWriteInt(_T(“MainWnd”), _T(“Bottom”), b, GetAbsolutePathName(CFG));
::IniWriteInt(_T(“MainWnd”), _T(“Left”), l, GetAbsolutePathName(CFG));
::IniWriteInt(_T(“MainWnd”), _T(“Right”), r, GetAbsolutePathName(CFG));

}
void CXXXXDlg::LoadMainWindow()
{
int t=0;
int b=0;
int l=0;
int r=0;
t=::IniReadInt(_T(“MainWnd”),_T(“Top”),2,GetAbsolutePathName(CFG));
b=::IniReadInt(_T(“MainWnd”),_T(“Bottom”),2,GetAbsolutePathName(CFG));
l=::IniReadInt(_T(“MainWnd”),_T(“Left”),1024,GetAbsolutePathName(CFG));
r=::IniReadInt(_T(“MainWnd”),_T(“Right”),768,GetAbsolutePathName(CFG));
m_DlgRect.top=t;
m_DlgRect.bottom=b;
m_DlgRect.left=l;
m_DlgRect.right=r;
}

//窗口动态调整
void CXXXXDlg::ChangeAllWnd()
{
CWnd* pWnd = GetWindow(GW_CHILD);
// TODO: Add your message handler code here
if (m_listRect.GetCount() > 0)
{
CRect dlgNow;
GetWindowRect(&dlgNow);
POSITION pos = m_listRect.GetHeadPosition();//第一个保存的是对话框的Rect
if (pos==NULL)
{
return;
}

	CRect dlgSaved;
	dlgSaved = m_listRect.GetNext(pos);
	ScreenToClient(dlgNow);

	float x = dlgNow.Width() * 1.0 / dlgSaved.Width();//根据当前和之前保存的对话框的宽高求比例  
	float y = dlgNow.Height() * 1.0 / dlgSaved.Height();
	ClientToScreen(dlgNow);

	CRect childSaved;

	while (pWnd)
	{	
		if (pos!=NULL)
		{
			childSaved = m_listRect.GetNext(pos);//依次获取子窗体的Rect  
			childSaved.left = dlgNow.left + (childSaved.left - dlgSaved.left) * x;//根据比例调整控件上下左右距离对话框的距离  
			childSaved.right = dlgNow.right + (childSaved.right - dlgSaved.right) * x;
			childSaved.top = dlgNow.top + (childSaved.top - dlgSaved.top) * y;
			childSaved.bottom = dlgNow.bottom + (childSaved.bottom - dlgSaved.bottom) * y;
			ScreenToClient(childSaved);
			pWnd->MoveWindow(childSaved,1);
			pWnd = pWnd->GetNextWindow();
		}
		else
		{
			break;
		}


	}
}
GetClientRect(&m_DlgRect); //save size of dialog
Invalidate(TRUE);

}
这样我们的对话框就可以自动随着拖动大小,自动缩放变化,再也不用担心窗口拖动变化显示不全的情况.

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值