MFC如何使控件大小随着对话框大小自动调整
MFC如何使控件大小隨著對(duì)話框大小自動(dòng)調(diào)整??
2012-04-27 16:24:50|??分類: MFC |??標(biāo)簽: |字號(hào)大中小?訂閱
對(duì)話框的大小變化后,假若對(duì)話框上的控件大小不變化,看起來會(huì)比較難看。下面就介紹怎么讓對(duì)話框上的控件隨著對(duì)話框的大小的變化自動(dòng)調(diào)整。
首先明確的是Windows有一個(gè)WM_SIZE消息響應(yīng)函數(shù),這個(gè)函數(shù)在對(duì)話框大小發(fā)生變化的時(shí)候調(diào)用,所以我們可以記錄下原來對(duì)話框的大小,還有當(dāng)前對(duì)話框的大小(這個(gè)不用自己算,系統(tǒng)已給出),然后根據(jù)控件做出相應(yīng)比例的調(diào)整。
比如原來對(duì)話框大小為a,現(xiàn)在為b,原來控件大小為c,那么現(xiàn)在的控件大小應(yīng)該為c*b/a;(注意a不能為0)。
看實(shí)例:(黑體字為添加的代碼!!)
假設(shè)對(duì)話框類為CMyDlg類,那么首先設(shè)置一個(gè)變量
CRect? m_rect;?? //用于保存原對(duì)話框大小
那么在對(duì)話框創(chuàng)建的時(shí)候先獲得對(duì)話框的大小
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);? //獲取對(duì)話框的大小
????????? return TRUE;? // return TRUE? unless you set the focus to a control
}
然后再手動(dòng)添加一個(gè)函數(shù),用以實(shí)現(xiàn)具體的變化
void CMyDlg::ChangeSize(UINT nID, int x, int y)? //nID為控件ID,x,y分別為對(duì)話框的當(dāng)前長(zhǎng)和寬
{
?????? CWnd *pWnd;
????? ?pWnd=GetDlgItem(nID);?
?????? if(pWnd!=NULL)???? //判斷是否為空,因?yàn)樵诖翱趧?chuàng)建的時(shí)候也會(huì)調(diào)用OnSize函數(shù),但是此時(shí)各個(gè)控件還沒有創(chuàng)建,Pwnd為空
?????? {
?????????????? CRect rec;
????????????? ?pWnd->GetWindowRect(&rec);? //獲取控件變化前的大小
?????????????? ScreenToClient(&rec);?? //將控件大小裝換位在對(duì)話框中的區(qū)域坐標(biāo)
?????????????? rec.left=rec.left*x/m_rect.Width();? //按照比例調(diào)整空間的新位置
????????????? ?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消息響應(yīng)函數(shù)OnSize:
void CMyDlg::OnSize(UINT nType, int cx, int cy)? //cx,cy就是當(dāng)前對(duì)話框的長(zhǎng)和寬
{
??????????? CDialog::OnSize(nType, cx, cy);
?
?????????? ?// TODO: Add your message handler code here
??????????? if(nType!=SIZE_MINIMIZED )? //判斷窗口是不是最小化了,因?yàn)榇翱谧钚』?,窗口的長(zhǎng)和寬會(huì)變成0,當(dāng)前一次變化的時(shí)就會(huì)出現(xiàn)除以0的錯(cuò)誤操作
???????? ?{
????????????????? ChangeSize(IDC_LIST1,cx,cy);? //對(duì)每一個(gè)控件依次做調(diào)整
????????????????? ChangeSize(IDC_LIST2,cx,cy);
???????????????? ?ChangeSize(IDC_BUTTON1,cx,cy);?
????????????????? ChangeSize(IDC_BUTTON2,cx,cy);?
????????????????? GetClientRect(&m_rect);?? //最后要更新對(duì)話框的大小,當(dāng)做下一次變化的舊坐標(biāo);
???????? }
}
任務(wù)完成!
總結(jié)
以上是生活随笔為你收集整理的MFC如何使控件大小随着对话框大小自动调整的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剖析java中的String之__拼接
- 下一篇: java 枚举学习--从小程序中学习