在視窗可縮放的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...