控制項大小隨視窗變化的正確方法

2021-05-08 08:26:54 字數 2175 閱讀 2944

一.在介紹這個方法之前先看下在網上見過一種方法:

vc++之根據對話方塊大小調整控制項大小

1、在對話方塊類中加入成員變數crect m_rect;用於儲存對話方塊大小變化前的大小;

2、在對話方塊的oninitdialog()函式中獲取對話方塊建立時的大小:getclientrect(&m_rect);

3、在wm_size的響應函式onsize()中加入以下**:

cwnd 

*pwnd;

pwnd 

=getdlgitem(idc_list);     

//獲取控制項控制代碼

if(pwnd)

//判斷是否為空,因為對話方塊建立時會呼叫此函式,而當時控制項還未建立

getclientrect(

&m_rect);

//將變化後的對話方塊大小設為舊大小

上面的**雖然可行,但當你右擊"我的電腦"--高階--效能--設定--視覺效果:選中"拖動時顯示視窗內容"並應用後,對話方塊上的控制項全部分亂掉,花掉.且上面的**沒有判斷最小化時的情況,當把對話方塊最小化時會出錯(加上 if(ntype==size_minimized )可解決這個問題 ).

二.正確的方法:

正確的方法是計算控制項與視窗的比例,對於大多數人來說,主要問題是不知道怎樣計算比例,計算誰跟誰之間的比例.下面的例子詳細說明了這個過程:

1.新建乙個對話方塊程式test,在對話方塊上放4個edit控制項,並關聯變數分別為cedit型別的m_edit1,m_edit2,m_edit3,m_edit4,成田字型放在對話方塊上面.再定義乙個結構(你也可以不用結構):

struct bili

;用於儲存比例值.

2.為主對話方塊類(ctestdlg)新增成員變數:

bili b1,b2,b3,b4;//記錄每個控制項與視窗的比例.

bool bresult;//判斷對話方塊第一次是否已初始化,如果沒有,在之後的onsize中會出錯.

3.oninitdialog()中的**,在return true之前加上:

crect crall,cr1,cr2,cr3,cr4;

getclientrect(&crall);

m_edit1.getwindowrect(&cr1);

screentoclient(&cr1);

m_edit2.getwindowrect(&cr2);

screentoclient(&cr2);

m_edit3.getwindowrect(&cr3);

screentoclient(&cr3);

m_edit4.getwindowrect(&cr4);

screentoclient(&cr4);

//計算比例

b1.dbottom=cr1.bottom*1.0/crall.height();

b1.dleft=cr1.left*1.0/crall.width();

b1.dright=cr1.right*1.0/crall.width();

b1.dtop=cr1.top*1.0/crall.height();

b2.dbottom=cr2.bottom*1.0/crall.height();

b2.dleft=cr2.left*1.0/crall.width();

b2.dright=cr2.right*1.0/crall.width();

b2.dtop=cr2.top*1.0/crall.height();

b3.dbottom=cr3.bottom*1.0/crall.height();

b3.dleft=cr3.left*1.0/crall.width();

b3.dright=cr3.right*1.0/crall.width();

b3.dtop=cr3.top*1.0/crall.height();

b4.dbottom=cr4.bottom*1.0/crall.height();

b4.dleft=cr4.left*1.0/crall.width();

b4.dright=cr4.right*1.0/crall.width();

b4.dtop=cr4.top*1.0/crall.height(); 

bresult=true;

4.在onsize()中加入**:

if(bresult)

對話方塊控制項大小隨視窗的大小變化而變化

我們經常會發現當我們將視窗最大化時,裡面的控制項並沒有進行改變,接下來我就介紹一下此問題的解決辦法,我們其實一般的都會把視窗的最大化按鈕失效,是視窗不能進行最大化操作,但是有時候我們還是需要對視窗進行最大化操作的,下面我們可以通過新增wm size訊息來解決此問題。1 在xxdlg.h中新增 afx...

VC 之隨視窗變化調整控制項大小

總結步驟 1.建立乙個cwnd 的陣列,在初始化時取的各個控制項的控制代碼,存在這個陣列裡面 2.處理wm size事件,可以得到新變化後的視窗和最初視窗的變化比例kx,ky 3.對陣列中的每乙個控制項,計算新位置 4.movewindow移動到新位置 對話方塊或視類的大小調後,控制項的大小和位置沒...

控制項大小隨視窗等比例變化

第一步 oninitdialog裡儲存對話方塊及其所有子窗體的rect區域 在主視窗類中新增成員變數 clistm listrect成員變數 crect rect getwindowrect rect m listrect.addtail rect 對話方塊的區域 cwnd pwnd getwind...