MFC实现对话框最大化时控件的集体跟踪
1.在对话框类中(.h文件)定义如下变量和函数
void ReSize(); POINT old; afx_msg void OnSize(UINT nType, int cx, int cy);
2.在OnInitDialog()中 计算出原始对话框的大小
CRect rect; GetClientRect(&rect); //取客户区大小 old.x=rect.right-rect.left; old.y=rect.bottom-rect.top;3.添加 WM_SIZE消息
void CSeakyDlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); if (nType == SIZE_RESTORED || nType == SIZE_MAXIMIZED) { ReSize(); } }
4.刷新控件函数
void CSeakyDlg::ReSize() { float fsp[2]; POINT Newp; //获取现在对话框的大小 CRect recta; GetClientRect(&recta); //取客户区大小 Newp.x = recta.right - recta.left; Newp.y = recta.bottom - recta.top; fsp[0] = (float)Newp.x / old.x; fsp[1] = (float)Newp.y / old.y; CRect Rect; int woc; CPoint OldTLPoint, TLPoint; //左上角 CPoint OldBRPoint, BRPoint; //右下角 HWND hwndChild = ::GetWindow(m_hWnd, GW_CHILD); //列出所有控件 while (hwndChild) { woc = ::GetDlgCtrlID(hwndChild);//取得ID GetDlgItem(woc)->GetWindowRect(Rect); ScreenToClient(Rect); OldTLPoint = Rect.TopLeft(); TLPoint.x = long(OldTLPoint.x*fsp[0]); TLPoint.y = long(OldTLPoint.y*fsp[1]); OldBRPoint = Rect.BottomRight(); BRPoint.x = long(OldBRPoint.x *fsp[0]); BRPoint.y = long(OldBRPoint.y *fsp[1]); Rect.SetRect(TLPoint, BRPoint); GetDlgItem(woc)->MoveWindow(Rect, TRUE); hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT); } old = Newp; }
