MFC如何使控件大小隨着對話框大小自動調整
2014-12-11 16:24:50| 分類: 默認分類 |舉報 |字號 訂閱
對話框的大小變化后,假若對話框上的控件大小不變化,看起來會比較難看。下面就介紹怎么讓對話框上的控件隨着對話框的大小的變化自動調整。
首先明確的是Windows有一個WM_SIZE消息響應函數,這個函數在對話框大小發生變化的時候調用,所以我們可以記錄下原來對話框的大小,還有當前對話框的大小(這個不用自己算,系統已給出),然后根據控件做出相應比例的調整。
比如原來對話框大小為a,現在為b,原來控件大小為c,那么現在的控件大小應該為c*b/a;(注意a不能為0)。
看實例:(黑體字為添加的代碼!!)
假設對話框類為CMyDlg類,那么首先設置一個變量
CRect m_rect; //用於保存原對話框大小
那么在對話框創建的時候先獲得對話框的大小
BOOL CMyDlg::OnInitDialog()
{
.........................
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
GetClientRect(&m_rect); //獲取對話框的大小
return TRUE; // return TRUE unless you set the focus to a control
}
然后再手動添加一個函數,用以實現具體的變化
void CMyDlg::ChangeSize(UINT nID, int x, int y) //nID為控件ID,x,y分別為對話框的當前長和寬
{
CWnd *pWnd;
pWnd=GetDlgItem(nID);
if(pWnd!=NULL) //判斷是否為空,因為在窗口創建的時候也會調用OnSize函數,但是此時各個控件還沒有創建,Pwnd為空
{
CRect rec;
pWnd->GetWindowRect(&rec); //獲取控件變化前的大小
ScreenToClient(&rec); //將控件大小裝換位在對話框中的區域坐標
rec.left=rec.left*x/m_rect.Width(); //按照比例調整空間的新位置
rec.top=rec.top*y/m_rect.Height();
rec.bottom=rec.bottom*y/m_rect.Height();
rec.right=rec.right*x/m_rect.Width();
pWnd->MoveWindow(rec); //伸縮控件
}
}
最后添加windows消息響應函數OnSize:
void CMyDlg::OnSize(UINT nType, int cx, int cy) //cx,cy就是當前對話框的長和寬
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(nType!=SIZE_MINIMIZED ) //判斷窗口是不是最小化了,因為窗口最小化之后 ,窗口的長和寬會變成0,當前一次變化的時就會出現除以0的錯誤操作
{
ChangeSize(IDC_LIST1,cx,cy); //對每一個控件依次做調整
ChangeSize(IDC_LIST2,cx,cy);
ChangeSize(IDC_BUTTON1,cx,cy);
ChangeSize(IDC_BUTTON2,cx,cy);
GetClientRect(&m_rect); //最后要更新對話框的大小,當做下一次變化的舊坐標
}
}
任務完成!