第一步:在头文件中添加成员变量CList<CRect,CRect&> m_listRect;
第二步:OnInitDialog里保存对话框及其所有子窗体的Rect区域
CRect rect; 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();//取下一个子窗体 }
第三步:在类向导里面(Ctrl+W),为窗体添加消息WM_SIZE的响应函数OnSize();
第四步:响应OnSize消息
CDialog::OnSize(nType, cx, cy); // TODO: Add your message handler code here if (m_listRect.GetCount() > 0) { CRect dlgNow; GetWindowRect(&dlgNow); POSITION pos = m_listRect.GetHeadPosition();//第一个保存的是对话框的Rect 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; CWnd* pWnd = GetWindow(GW_CHILD); while(pWnd) { 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); pWnd = pWnd->GetNextWindow(); } }