一種保持VC對話方塊布局的簡便方法

2021-09-30 06:30:07 字數 1897 閱讀 7922

在視窗可縮放的vc應用程式中,在縮放時保持視窗的布局很重要。網上有很多複雜的布局控制**可供參考。有些**很強大,但如果你的視窗只是個簡單的對話方塊,也許可以試試本文的方法。這個方法夠簡單。

別去管那些錨點、對齊之類的詞彙了,強大的功能在某種程度上也意味著更多的**。簡單地記住當前的視窗布局,然後按比例縮放這些控制項。這樣的方法在很多應用中,效果也非常不錯。

本著更簡單的精神,我沒有定義乙個基類來讓你繼承,也沒有類讓你使用,甚至沒有寫乙個函式。我寫了三個巨集!

#define fix_layout_data int  m_ow, m_oh;  std::mapm_originlayout;

#define fix_layout_init { /

m_originlayout.clear();/

crect rect;/

getclientrect( rect);/

m_ow = rect.width();/

m_oh = rect.height();/

hwnd item = null;/

rect r;/

while( null != (item = ::findwindowex(getsafehwnd(), item, null, null) ) )/

if (!::getwindowrect(item, &r))/

continue;/

screentoclient(&r);/

m_originlayout[item] = r;/

#define fix_layout_size {/

if (m_ow == 0)/

m_ow = cx;/

if(m_oh == 0)/

m_oh = cy;/

float rw = (float)cx/ m_ow;/

float rh = (float)cy/ m_oh;/

hwnd item = null;/

crect r;/

while( null != (item = ::findwindowex(getsafehwnd(), item, null, null) ) )/

if (m_originlayout.find(item) == m_originlayout.end())/

continue;/

r = m_originlayout[item];/

r.left *= rw;/

r.right    *= rw;/

r.top  *= rh;/

r.bottom*= rh;/

::movewindow(item, r.left, r.top, r.right - r.left, r.bottom - r.top, true);/

fix_layout_data巨集,定義儲存布局資訊的成員變數;

fix_layout_init巨集,獲取視窗中當前的布局資訊;

fix_layout_size巨集,在視窗大小發生變化時,調整各子視窗的位置和大小。

使用方法:

在你的視窗定義類中加入fix_layout_data巨集。

在視窗的初始化函式中加入fix_layout_init巨集。

在視窗的onsize響應函式中加入fix_layout_size巨集。

說明:如果你的視窗在執行時,有些控制項會發生變化,你也可以在變化發生後,重新呼叫fix_layout_init巨集,這樣新的變化就會更新在布局資訊資料中。

問題1:如果我的視窗中,有的控制項不需要縮放怎麼辦?

回答:請使用其它更強大的布局控制程式,或者自己寫乙個。

問題2:如果的視窗布局不想按比例控制怎麼辦?

問題3:按比例縮放會不會很難看?

回答:當然可以,完全沒問題。

問題5:我討厭巨集,一點也物件導向,太落後了。。。

回答:我知道,我理解,我只是想把程式寫的簡單些!

對話方塊視窗過程的另外一種實現方法

在之前的一篇關於對話方塊返回值的文章中,有人建議說可以使用另外一種不同的搞法 也即直接呼叫defdlgproc這個api函式 就類似於視窗訊息過程中呼叫預設的訊息處理函式defwindowproc一樣,而不是直接返回true或者false。實際上,我們準備試它兩次。今天我會使用上述所說的方法,過幾天...

WPF程式設計,C 中對話方塊自動關閉的一種方法。

messageboxtimeout是乙個微軟未公開的windows api函式。實現定時訊息,功能類似於messagebox。如果使用者不回應,能定時關閉訊息框。函式由user32.dll匯出,windows2000及以下沒有此函式。原型 int messageboxtimeouta hwnd hw...

MFC學習第十節 輸出對話方塊(第一種方法)

1.在resource中右擊dialog插入乙個對話方塊。在menu中新增選單關於。2.右擊建立乙個名為mydialog類。3.在view.h中定義cstring strname 加標頭檔案 include mydialog.h 4.在view.cpp中的建構函式中給strname初始化。在ondr...