天天看點

C/C++自動調整界面布局的對話框EasySize - Dialog resizing in no time!

CodeProject上的例子:

<a href="http://www.codeproject.com/Articles/1657/EasySize-Dialog-resizing-in-no-time">http://www.codeproject.com/Articles/1657/EasySize-Dialog-resizing-in-no-time</a>

處理過這個問題的朋友們就應該知道,所謂的控件動态調整就是在主視窗的OnSize消息裡處理一下,根據視窗的大小重新布置控件的位置。而解決這個問題的關鍵在于如何管理界面中的控件資訊,進而可以比較友善的實作對控件的重新布局。我的處理方式是這樣的,我定義了一個結構tagCONTROL,其内容如下

從這個定義中我們可以看出tagCONTROL裡儲存了豐富的對于控件布局的控制資訊,這裡m_pWnd是指向被控控件的指針,他可以是一個控件也可以是一個視窗,這樣就把界面布局的控制元素全都囊括進來了。而移動、縮放的百分比控制使界面布局的控制更加靈活,更加友善。每一個需要調整布局的界面元素都會通過這個結構來儲存其資訊,而在界面主視窗中維護一個這種結構的清單即可在OnSize函數中友善的實作控件布局的自動調整。

所謂界面動态調整布局實際上應該有一個參照,也就是說我們應該記錄初始顯示時界面的大小和此時界面中控件的位置。以後的調整都是基于這些資訊的,也就是說tagCONTROL中儲存的資訊都是通過初始的基本資料起作用的。按着這個思路,在OnSize函數中我是這樣實作的

同時,一個設計良好的界面的一般會有一個最小大小,在這個範圍内安排界面布局。通常情況下我們不希望界面小于這個最小大小,這個需求可以通過重載WM_GETMINMAXINFO消息來實作

這樣一來,隻要我們設計好控制資訊,我們設計的界面即使被使用者縮放和拖拽也可以展現出良好的布局。這個方案是我這些年來一直在項目中采用的,我不敢說它是完美的,但是卻是能夠滿足一般的需求。如果大家在對這個方案的研究和使用中發現什麼問題或是可以改進的地方還希望可以告訴我,我會加以改進再和朋友們分享。

以上是原文内容,下面是個人在使用中進行的擴充:

繼續閱讀