做界面時使兩控件對齊的方法

       大家都知道,VC界面編輯器中使用的尺寸不是像素,具體是怎麼來的我也不知道,總之界面編程器中的1個單位不等於1像素,他們之間有個比例,這個比例還不是整數,是個浮點數,而且精度還很高!我不知道VC爲什麼要這樣做,但既然別人已經這樣做了,我們只有想辦法解決問題,出現的問題如下,舉幾個例子:

只說垂直上面的問題,水平上面的一樣。
一:兩個控件,如group box,如果他們頂邊不對齊,那麼可能他們的底邊無法對齊,比如他們底邊相差1像素的話,就是這樣的,因爲不管你移動控件也好,增減控件高度也好,他們的步長是編輯器的1單位,這個1單位大於1像素。

二:兩個列表框(report),如果某一個列表框最後一項剛好完全顯示出來,那麼另一個列表框(如果他們高度不相等的話)要想也使最後一項剛好完全顯示出來是非常困難的。

當然,我上面說的不是絕對無法解決,例如可以使兩控件的高度差增大,當高度差大到一定程度的時候,
這種比例造成的誤差自然會拆回到起點,這樣就行了,比如說目前我正在使用的兩個列表框(report),一個高111,一個高172(都是編輯器單位,9號宋體),他們的最後一項寬度剛好一樣。

       上面的辦法當然非常的不理想,由於不知道比例是多少,所以只有窮舉來找拆回點,而且既然是界面編程,拿上面的例子來說,如果界面要求第一個列表框高111,而第二個要大於111而小172的話,就沒有辦法使最後一項所佔高相等了!

       既然不能通過界面編程器來達到絕對對齊,那麼只有用別的方法了,好在MFC提供了MoveWindow,這也可能是VC界面編輯器中使用相對粗糙的位置定位方法吧。具體方法就是在初始化函數,如對話框的OnInitDialog函數中,先取得要移動的控件的窗口位置數據,再計算移動後的窗口位置,最後是調用MoveWindow,如下:

CRect rect;
GetDlgItem(IDC_XXXX)->GetWindowRect(rect);
rect.OffsetRect(0, +/-1); //這裏一般是正負1,大於正負1的時候可以通過界面編程器移動,不用在這裏麻煩
ScreenToClient(rect);
GetDlgItem(IDC_XXXX)->MoveWindow(rect);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章