VC控件大小隨窗體改變_第1頁
VC控件大小隨窗體改變_第2頁
VC控件大小隨窗體改變_第3頁
VC控件大小隨窗體改變_第4頁
VC控件大小隨窗體改變_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、般情況下,我們新建的對話框,里面的確定”和:取消”按鈕,在對話框最大化得時(shí)候,不會(huì)一起變大的,而是保持原來的大小。最簡單的情況:當(dāng)我們點(diǎn)擊最大化按鈕的時(shí)候,對話框會(huì)最大化,但是控件確定”和取消”不會(huì)跟著變大。 如果我們在對話框上面有多少控件, 那么會(huì)很丑,而且很不實(shí)用,最大化本來就是想看的更 清楚嘛。我們可以采取下面的措施:對話框也是窗口,最大化是對窗口大小的改變,而在win dowsmessage handle中有個(gè) WM_SIZE的消息,該消息在窗口大小發(fā)生變化的時(shí)候會(huì)產(chǎn)生。那么 我們可以根據(jù)這個(gè)消息,在窗口大小發(fā)生變化的時(shí)候,利用MoveWindow()函數(shù)來重新設(shè)置各個(gè)控件的大小。還是

2、以上面最簡單的情況為例子:1首先要知道對話框大小是否改變,改變了多少,我們應(yīng)該記錄當(dāng)前對話框的大小。在對話框類中添加成員變量 CRect m_rect 他是用來記錄當(dāng)前對話框的大小。我們在 OnInitDialog() 函數(shù)中獲取對話框創(chuàng)建時(shí)的大小: GetClientRect(&m_rect);2 增加消息 WM_SIZE 的消息響應(yīng)函數(shù) OnSize(): 只要對話框大小發(fā)生變化,就會(huì)調(diào)用該函 數(shù)。3在OnSize()函數(shù)中增加如下代碼:(最簡單的為例子,就一個(gè)確定按鈕和取消按鈕)void CTestDlg:OnSize(UINT nType, int cx, int cy)CDi

3、alog:OnSize(nType, cx, cy);/ TODO: Add your message handler code herefor (int i=1;i<=2;i+)/因?yàn)槭莾蓚€(gè)控件,所以這里用了循環(huán)CWnd *pWnd;pWnd = GetDlgltem(i);/獲取ID為i的空間的句柄,因?yàn)?確認(rèn)” ID為1,取消” D為2if(pWnd) /判斷是否為空,因?yàn)閷υ捒騽?chuàng)建時(shí)會(huì)調(diào)用此函數(shù),而當(dāng)時(shí)控件還未創(chuàng)建CRect rect;/獲取控件變化前的大小pWnd->GetWindowRect(&rect);ScreenToClient(&rect /將控

4、件大小轉(zhuǎn)換為在對話框中的區(qū)域坐標(biāo)/cx/m_rect.Width() 為對話框在橫向的變化比例rect.left=rect.left*cx/m_rect.Width();/ 調(diào)整控件大小rect.right=rect.right*cx/m_rect.Width();rect.top=rect.top*cy/m_rect.Height();rect.bottom=rect.bottom*cy/m_rect.Height();pWnd->MoveWindow(rect);/ 設(shè)置控件大小GetClie ntRect(&m _rect); 將變化后的對話框大小設(shè)為舊大小然后運(yùn)行,當(dāng)對話

5、框最大化的時(shí)候,兩個(gè)按鈕也變大了。個(gè)為全屏圖太大,我只截取了右上角的部分)PS:其實(shí)這種方法實(shí)現(xiàn)起來簡單,但是是存在問題的,如果界面有很多控件,那個(gè)當(dāng)你拖拽窗口的角的時(shí)候, 經(jīng)過幾次變大變小, 你會(huì)發(fā)現(xiàn)其實(shí)里面的控件已經(jīng)失真了,就不是原來 的長寬比例了。 那么要實(shí)現(xiàn)不管窗口怎么變, 里面的控件不但大小跟著變, 而且大小比例也 跟著變,那就不是這個(gè) OnSize 函數(shù)那么簡單了,實(shí)現(xiàn)起來有點(diǎn)復(fù)雜。等我掌握了這個(gè)復(fù)雜 的方法,一定會(huì)拿來分享的。mfc 控件大小隨窗體改變而改變 如果對話框或視類的大小調(diào)后,控件的大小和位置沒有變化,界面看起來會(huì)很不爽 .控件是從 CWnd 派生的,但不能使用 Set

6、WindowPos() 或 OnSize() 或 OnSizing() 來改 變其大小,應(yīng)在父窗口的 WM_SIZE 消息中使用 MoveWindow() 來進(jìn)行調(diào)整。VC+ 之根據(jù)對話框大小調(diào)整控件大小1、在對話框類中加入成員變量 CRect m_rect; 用于保存對話框大小變化前的大小;2、在對話框的 OnInitDialog() 函數(shù)中獲取對話框創(chuàng)建時(shí)的大小:GetClientRect(&m_rect);3、在 WM_SIZE 的響應(yīng)函數(shù) OnSize() 中加入以下代碼:CWnd *pWnd;pWnd = GetDlgItem(IDC_LIST); /獲取控件句柄if(pWn

7、d)/ 判斷是否為空,因?yàn)閷υ捒騽?chuàng)建時(shí)會(huì)調(diào)用此函數(shù),而當(dāng)時(shí)控件還未創(chuàng)建CRect rect; / 獲取控件變化前大小 pWnd->GetWindowRect(&rect);ScreenToClient(&rect);/ 將控件大小轉(zhuǎn)換為在對話框中的區(qū)域坐標(biāo)/ cx/m_rect.Width() 為對話框在橫向的變化比例 rect.left=rect.left*cx/m_rect.Width();/ 調(diào)整控件大小rect.right=rect.right*cx/m_rect.Width(); rect.top=rect.top*cy/m_rect.Height(); rec

8、t.bottom=rect.bottom*cy/m_rect.Height(); pWnd->MoveWindow(rect);/ 設(shè)置控件大小 GetClientRect(&m_rect);/ 將變化后的對話框大小設(shè)為舊大小如果是里面只有一兩個(gè)控件倒好辦,但控件太多的話這樣做是不是重復(fù)勞動(dòng)太多了?有沒有更好的辦法啊?視類中加成員函數(shù)和成員變量:void SetControlInfo(WORD CtrlId);protected:int m_old_cx,m_old_cy;CDWordArray m_control_info;構(gòu)造函數(shù)中初始化:m_old_cx = m_old_c

9、y = 0;加控件信息的函數(shù)定義:void CTestFormView:SetControlInfo(WORD CtrlId)m_control_info.Add(CtrlId);修改 OnSize 函數(shù):void CTestFormView:OnSize(UINT nType, int cx, int cy) if(cx=0 | cy=0)cx=800;cy=600;CFormView:OnSize(nType, cx, cy);(float)(float)cx/(float)m_old_cx);(float)(float)cy/(float)m_old_cfloatdx_percent=(

10、m_old_cx=0)?1floatdy_percent=(m_old_cy=0)?1y);if(m_old_cx)CRect WndRect;CWnd *pWnd;for(int i = 0; i < m_control_info.GetSize(); i+)pWnd = GetDlgItem(m_control_infoi); if(!pWnd)TRACE( "Control ID - %d NOT FOUND!n ",m_control_infoi);continue;pWnd-> GetWindowRect(&WndRect);ScreenToClient(&WndRect);WndRect.left = (int)(WndRect.left*dx_percent);WndRect.right = (int)(WndRect.right* dx_percent);WndRect.bottom = (int)(WndRect.bottom*dy_percent);WndRect.top = (

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論