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

下載本文檔

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

文檔簡介

1、一一個基于對話框的MFC界面,怎么樣才能讓對話框里的控件能和對話框同比例變小變大?今天我一直想解決這個問題,這是師姐留給我的任務(wù)。經(jīng)過在網(wǎng)上的大量搜素,終于找到了解決方法,其實(shí)比較簡單。   一般情況下,我們新建的對話框,里面的“確定”和:取消”按鈕,在對話框最大化得時(shí)候,不會一起變大的,而是保持原來的大小。   最簡單的情況:     當(dāng)我們點(diǎn)擊最大化按鈕的時(shí)候,對話框會最大化,但是控件“確定”和“取消”不會跟著變大。如果我們在對話框上面有多少控件,那么會很丑,而且很不實(shí)用,最大化本來就是想看的更清楚嘛。 

2、60; 我們可以采取下面的措施:對話框也是窗口,最大化是對窗口大小的改變,而在windows message handle中有個WM_SIZE的消息,該消息在窗口大小發(fā)生變化的時(shí)候會產(chǎn)生。那么我們可以根據(jù)這個消息,在窗口大小發(fā)生變化的時(shí)候,利用MoveWindow()函數(shù)來重新設(shè)置各個控件的大小。   還是以上面最簡單的情況為例子: 1  首先要知道對話框大小是否改變,改變了多少,我們應(yīng)該記錄當(dāng)前對話框的大小。    在對話框類中添加成員變量 CRect m_rect  他是用來記錄當(dāng)前對話框的大小。我們在OnIn

3、itDialog()函數(shù)中獲取對話框創(chuàng)建時(shí)的大?。篏etClientRect(&m_rect); 2 增加消息WM_SIZE的消息響應(yīng)函數(shù) OnSize():只要對話框大小發(fā)生變化,就會調(diào)用該函數(shù)。 3 在OnSize()函數(shù)中增加如下代碼:(最簡單的為例子,就一個確定按鈕和取消按鈕)來源:() - MFC:如何讓對話框中的控件和對話框一起變小變大_蕭蕭_新浪博客    void CTestDlg:OnSize(UINT nType, int cx, int cy) CDialog:OnSize(nType, cx, cy); 

4、; / TODO: Add your message handler code here  for (int i=1;i<=2;i+)     /因?yàn)槭莾蓚€控件,所以這里用了循環(huán)    CWnd *pWnd;   pWnd = GetDlgItem(i);     /獲取ID為i的空間的句柄,因?yàn)椤按_認(rèn)”ID為1,“取消”ID為2  if(pWnd)  /判斷是否為空,因?yàn)閷υ捒騽?chuàng)建時(shí)會調(diào)用此函數(shù),而當(dāng)時(shí)控件還未創(chuàng)建&#

5、160;    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.rig

6、ht*cx/m_rect.Width();   rect.top=rect.top*cy/m_rect.Height();   rect.bottom=rect.bottom*cy/m_rect.Height();   pWnd->MoveWindow(rect);/設(shè)置控件大小      GetClientRect(&m_rect);/ 將變化后的對話框大小設(shè)為舊大小     然后運(yùn)行 ,當(dāng)對話框最大化的時(shí)候,兩個按鈕也變大了。  

7、0;               (因?yàn)槿翀D太大,我只截取了右上角的部分) PS:其實(shí)這種方法實(shí)現(xiàn)起來簡單,但是是存在問題的,如果界面有很多控件,那個當(dāng)你拖拽窗口的角的時(shí)候,經(jīng)過幾次變大變小,你會發(fā)現(xiàn)其實(shí)里面的控件已經(jīng)失真了,就不是原來的長寬比例了。那么要實(shí)現(xiàn)不管窗口怎么變,里面的控件不但大小跟著變,而且大小比例也跟著變,那就不是這個OnSize函數(shù)那么簡單了,實(shí)現(xiàn)起來有點(diǎn)復(fù)雜。等我掌握了這個復(fù)雜的方法,一定會拿來分享的。二mfc 控件大小隨窗

8、體改變而改變 如果對話框或視類的大小調(diào)后,控件的大小和位置沒有變化,界面看起來會很不爽. 控件是從CWnd派生的,但不能使用SetWindowPos()或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 *p

9、Wnd;pWnd = GetDlgItem(IDC_LIST); /獲取控件句柄if(pWnd)/判斷是否為空,因?yàn)閷υ捒騽?chuàng)建時(shí)會調(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

10、.top=rect.top*cy/m_rect.Height();rect.bottom=rect.bottom*cy/m_rect.Height();pWnd->MoveWindow(rect);/設(shè)置控件大小GetClientRect(&m_rect);/將變化后的對話框大小設(shè)為舊大小三 如果是里面只有一兩個控件倒好辦,但控件太多的話這樣做是不是重復(fù)勞動太多了? 有沒有更好的辦法???視類中加成員函數(shù)和成員變量:         void   SetControlInfo(WORD   CtrlId); pr

11、otected:         int   m_old_cx,m_old_cy;         CDWordArray   m_control_info;   構(gòu)造函數(shù)中初始化:         m_old_cx   =   m_old_cy   =   0;   加控件信息的函數(shù)定義: void   CTestFormView:SetControlInfo(WORD  

12、CtrlId)         m_control_info.Add(CtrlId);     修改OnSize函數(shù): void   CTestFormView:OnSize(UINT   nType,   int   cx,   int   cy)         if(cx=0   |   cy=0)                

13、        cx=800;                 cy=600;                 CFormView:OnSize(nType,   cx,   cy);         float   dx_percent   =   (m_old_cx   =0)?  

14、1   :   (float)(float)cx/(float)m_old_cx);         float   dy_percent   =   (m_old_cy   =0)?   1   :     (float)(float)cy/(float)m_old_cy);           if(m_old_cx)            

15、            CRect   WndRect;                 CWnd   *pWnd;                 for(int   i   =   0;   i   <   m_control_info.GetSize();   i+) 

16、0;                                       pWnd   =   GetDlgItem(m_control_infoi);                         if(!pWnd)      

17、                                                   TRACE( "Control   ID   -   %d   NOT   FOUND!n ",m_control_infoi);       &#

18、160;                         continue;                                                   pWnd-> GetWindowRect(&a

19、mp;WndRect);                         ScreenToClient(&WndRect);                           WndRect.left   =   (int)(WndRect.left*dx_percent);                         WndRect.right   =   (int)(WndRect.right*   dx_percent);                         WndRect.bottom   =   (int)(W

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論