這一篇介紹的是怎么實現MFC窗口的最大最小化,以及里面控件大小也隨之改變
第一步:實現窗口最大最小化
首先右擊窗口空白處,打開properties,將里面的MaximizeBox和MinimizeBox都選擇為true,這時候窗口已經有最大最小化了,不過控件大小卻不變
第二步:實現控件大小位置變化
右擊窗口空白處,打開類視圖(Class Wizard)--> 點擊選項Messages --> 找到WM_SIZE選中 --> 添加處理程序(Add handler)--> 編輯代碼(Edit code)
在這個函數里面添加如下代碼

void CframestudyDlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); // TODO: Add your message handler code here if (nType == SIZE_RESTORED || nType == SIZE_MAXIMIZED) { resize(); } }
其中resize()函數需要我們自己添加,這是一個自定義的函數,在上面函數下添加就可以了,當然沒有硬性要求

void CframestudyDlg::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; }
resize()前面CframestudyDlg是自己的函數名,跟你創建時其他函數前綴保持一致就好。
寫完函數后,要在.h文件里面寫上函數原型。
打開frame_studyDlg.h
在public部分添加
POINT Old; void resize();
最后一步就是要在onInitDialog()函數里面添加一段代碼,里面會有一句“TODO: Add extra initialization here”這一句,在下面添加即可。
// TODO: Add extra initialization here CRect rect; GetClientRect(&rect);//取客戶區大小 Old.x = rect.right - rect.left; Old.y = rect.bottom - rect.top;
現在,大功告成了。