C C 自動調整介面布局的對話方塊

2021-09-01 15:56:12 字數 1754 閱讀 6851

例子:

codeproject上的例子:

早在2023年我就寫過一篇部落格叫

可適配控制項對話方塊

,那個時候一方面是工作需要研究了這個問題,另一方面是發現論壇裡有很多人問相關的問題,於是就把自己的研究成果做了乙個小例子發了上來,還寫了那篇部落格。

說來慚愧,首先那時那個例子其實是我照著網上乙個例子改的,而且基本框架也差不多,我簡單加了些自己的東西改了改名就發出來了,唉......如今原作者以無法考正了,在此對其表示感謝吧。然後那個例子其實不是很好用,當時並沒有發現什麼問題,但是隨著工作中使用的增多我發現了不少缺陷,也在工作中不斷的改進,終於做出了乙個自己用的很舒服的版本。如今三年過去了,再看csdn介面版仍然有很多網友問及此類問題,visualeleven力推codeproject上的easysize。easysize當初我也簡單看過,不過那時我並沒看懂,估計我現在也看不懂,呵呵。不過我覺得我用的這個方法也蠻好的,所以決定再寫一篇部落格把現在的方法介紹一下,同時整理了乙個例子供大家研究。

處理過這個問題的朋友們就應該知道,所謂的控制項動態調整就是在主視窗的onsize訊息裡處理一下,根據視窗的大小重新布置控制項的位置。而解決這個問題的關鍵在於如何管理介面中的控制項資訊,從而可以比較方便的實現對控制項的重新布局。我的處理方式是這樣的,我定義了乙個結構tagcontrol,其內容如下

/**

* 控制項隨視窗變化的控制單元

**/typedef struct tagcontrol

controlinfo, *lpcontrolinfo;

從這個定義中我們可以看出tagcontrol裡儲存了豐富的對於控制項布局的控制資訊,這裡m_pwnd是指向被控控制項的指標,他可以是乙個控制項也可以是乙個視窗,這樣就把介面布局的控制元素全都囊括進來了。而移動、縮放的百分比控制使介面布局的控制更加靈活,更加方便。每乙個需要調整布局的介面元素都會通過這個結構來儲存其資訊,而在介面主視窗中維護乙個這種結構的列表即可在onsize函式中方便的實現控制項布局的自動調整。

所謂介面動態調整布局實際上應該有乙個參照,也就是說我們應該記錄初始顯示時介面的大小和此時介面中控制項的位置。以後的調整都是基於這些資訊的,也就是說tagcontrol中儲存的資訊都是通過初始的基本資料起作用的。按著這個思路,在onsize函式中我是這樣實現的

void cautofitdlg::onsize(uint ntype, int cx, int cy)

} cdialog::onsize(ntype, cx, cy);

}

同時,乙個設計良好的介面的一般會有乙個最小大小,在這個範圍內安排介面布局。通常情況下我們不希望介面小於這個最小大小,這個需求可以通過過載wm_getminmaxinfo訊息來實現

void cautofitdlg::ongetminmaxinfo(minmaxinfo* lpmmi)

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

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

/**

* 控制項隨視窗變化的控制單元

**/typedef struct tagcontrol

controlinfo, *lpcontrolinfo;

對話方塊控制項自動調整大小, 位置

class cwndautopos public cwndautopos cwndautopos bool clear bool additem intnid,bool bredraw false,intnpersentx 0,intnpersenty 0,intnpersentwidth 0,in...

自動關閉MessageBox對話方塊

方法1 模擬回車實現 settimer 1,1000,null messagebox test test1 在ontimer uint nidevent 中 if nidevent 1 方法2 getforegroundwindow 得到控制代碼 sendmessagecallback傳送訊息 vo...

對話方塊 空間調整 快捷鍵

命令 鍵 說明格式.底部對齊 ctrl shift 向下鍵 將選定控制項的底邊與主導控制項對齊 format.aligncenters shift f9 將選定控制項的垂直中心與主導控制項對齊 format.alignlefts ctrl shift 向左鍵 選定控制項的左邊緣與主導控制項對齊 fo...