日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC如何使控件大小随着对话框大小自动调整

發(fā)布時(shí)間:2023/12/2 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC如何使控件大小随着对话框大小自动调整 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。