MFC/VC++/VS 控制元件隨對話方塊尺寸變化
阿新 • • 發佈:2019-02-09
1. 獲取對話方塊尺寸
CRect m_rect; //用於儲存原對話方塊大小
GetClientRect(&m_rect); //獲取對話方塊的大小
2. OnSize 訊息
if (m_rect.Width() == 0 || m_rect.Height() == 0) { return; } if(nType != SIZE_MINIMIZED ) //判斷視窗是不是最小化了,因為視窗最小化之後 ,視窗的長和寬會變成0,當前一次變化的時就會出現除以0的錯誤操作 { CWnd *pWnd = NULL; pWnd = GetWindow(GW_CHILD); while(pWnd != NULL) { ChangeCtrlSize(pWnd->GetDlgCtrlID(), cx, cy); // 對每一個控制元件依次做調整 pWnd=pWnd-> GetNextWindow(GW_HWNDNEXT); } GetClientRect(&m_rect); //最後要更新對話方塊的大小,當做下一次變化的舊座標 }
3. ChangeCtrlSize
void XXXDlg::ChangeCtrlSize(UINT nID, int ix, int iy) //nID為控制元件ID,x,y分別為對話方塊的當前長和寬 { float fx = float(ix); float fy = float(iy); CWnd *pWnd = NULL; pWnd = GetDlgItem(nID); if(pWnd != NULL) //判斷是否為空,因為在視窗建立的時候也會呼叫OnSize函式,但是此時各個控制元件還沒有建立,Pwnd為空 { CRect rect; pWnd->GetWindowRect(&rect); //獲取控制元件變化前的大小 ScreenToClient(&rect); //將控制元件大小裝換位在對話方塊中的區域座標 rect.left = int(rect.left * fx / (float)m_rect.Width()); //按照比例調整空間的新位置 rect.top = int(rect.top * fy / (float)m_rect.Height()); rect.bottom = int(rect.bottom * fy / (float)m_rect.Height()); rect.right = int(rect.right * fx / (float)m_rect.Width()); pWnd->MoveWindow(rect); //伸縮控制元件 } }