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);
}
这样我们的对话框就可以自动随着拖动大小,自动缩放变化,再也不用担心窗口拖动变化显示不全的情况.