VS2013 MFC 對話方塊控制元件大小隨視窗大小改變而改變
阿新 • • 發佈:2019-02-04
視窗大小改變後控制元件大小也隨之改變
在對話方塊標頭檔案中定義
標頭檔案名稱:專案名稱Dlg.h
POINT Old;//存放對話方塊的寬和高。
對話方塊cpp中初始化
cpp檔名稱:專案名稱Dlg.cpp
在OnInitDialog()函式中新增
CRect rect;
GetClientRect(&rect); //取客戶區大小
Old.x = rect.right - rect.left;
Old.y = rect.bottom - rect.top;
新增WM_SIZE訊息
在類嚮導中為對話方塊類新增WM_SIZE訊息,如圖
然後編輯程式碼,在函式中新增以下程式碼
void C槍支編碼識別Dlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此處新增訊息處理程式程式碼 if (nType == SIZE_RESTORED || nType == SIZE_MAXIMIZED)//窗體大小發生變動。處理程式 { 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]); //高度不可讀的控制元件(如:combBox),不要改變此值. Rect.SetRect(TLPoint, BRPoint); GetDlgItem(woc)->MoveWindow(Rect, TRUE); hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT); } Old = Newp; }
}