VS2010 MFC 控制元件隨主框體變化而變化
阿新 • • 發佈:2018-12-11
這裡介紹一種控制控制元件隨主框體變化而變化的方法。
方法並不完善,框體只支援最大化和最小化視窗時還好,但是在連續最大化最小化切換10次以上以後,控制元件在主框體中的相對位置會向左上角移動,幅度並不大,基本可以滿足應用需要;
但如果主框體動態的變化大小,控制元件的相對位置變化的非常快,基本不能使用。
自己使用MFC只是做一些小工具,或者測試工具,自己或者同事使用,只使用最大化和最小化視窗,基本也滿足需要了。
下面介紹方法:
1、在對話方塊類中新增成員變數 CRect m_rectOrg 它是用來記錄當前對話方塊的大小。
在OnInitDialog()函式中獲取對話方塊建立時的大小:GetClientRect(&m_rectOrg )。
2、在對話方塊類中新增函式void ChangeSize(CWnd * pWnd, int cx, int cy),根據主框體的變化改變控制元件大小。
void CTESTDlg::ChangeSize(CWnd * pWnd, int cx, int cy) { if (pWnd) { CRect rect; pWnd->GetWindowRect(&rect); //獲取控制元件變化前的大小 ScreenToClient(&rect); //將控制元件大小轉換為在對話方塊中的區域座標 rect.left=rect.left*cx/m_rectOrg.Width(); //調整控制元件大小 ,cx/m_rectOrg.Width()為對話方塊在橫向的變化比例 rect.right=rect.right*cx/m_rectOrg.Width(); //cx儲存的是變化後的寬度,cy儲存的是變化後的高度 rect.top=rect.top*cy/m_rectOrg.Height(); //m_rectOrg.height()表示的是變化前主窗體的高度 rect.bottom=rect.bottom*cy/m_rectOrg.Height(); pWnd->MoveWindow(rect); //設定控制元件大小 } }
3、在MFC 類嚮導中新增訊息WM_SIZE,如下圖所示:
4、修改void CTESTDlg::OnSize(UINT nType, int cx, int cy)
void CTESTDlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); // TODO: 在此處新增訊息處理程式程式碼 if(nType==SIZE_MINIMIZED) return; //最小化則什麼都不做 CWnd *pWnd; int ctrlID; HWND hWndChild = ::GetWindow(m_hWnd, GW_CHILD); //列出所有控制元件 while(hWndChild) { ctrlID= ::GetDlgCtrlID(hWndChild); pWnd = GetDlgItem(ctrlID); //獲取控制元件控制代碼 ChangeSize(pWnd,cx,cy); hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT); } GetClientRect(&m_rectOrg); }