wxSizer是一個可嵌套的容器,用於對控件的位置進行排布。本文對它作了介紹。
皿
當我們需要寫自己的dialog的時候,需要佈置好控件的位置,界面才美觀.可是如果控件比較多的化,難道我們需要對每個都指定座標麼?還有一個重要的問題是,這個過程不是"所見即所得"!(當然現在wxWidgets也有可視的界面編輯器了,這裏不考慮這個).這個對於從VC/Delphi轉過來的程序員會比較不適應,因爲IDE有集成界面編輯器,非常方便調整界面.對於寫過AWT(java),GTK,QT的人來說,相信都用過類似layout的東西.wxWidgets中wxSizer就是做這個的.
我們先說說一些基本的概念.
1.所有的sizers都是容器.並且是可嵌套的.
2.item的最小尺寸
一般的控件最小尺寸就是初試化的時候的默認值.有些控件是可以計算他們的尺寸的(例如Checkbox),但是有些不好計算,例如listbox,寬高都是不確定的,因爲可以有滾動條:-).有些則能計算高度,不能計算寬度,比如text control.
3.item的邊框
包圍着控件的周圍的空白空間.每個控件都有自己的邊框.邊框的大小是可以設置的.位置也可以設置的,比如只有左邊有邊框,或者上下有,左右沒有.
4.item是可對齊的
可以居中/上/小/左/右等對齊方式.
5.item是可伸縮的
一個item一般佔用空間包括item的最小尺寸和邊框.但是這個是可以伸縮的.
6.item是可以手工設置爲隱藏的
使用wxSizer::Show函數實現.注意後面接着要調用Layout函數強制更新界面佈局.當我們想隱藏部分界面的時候,這個功能非常有用.避免我們做這樣的事情:先從sizer中把控件移除,然後需要的時候在加入.但是要注意的,這個只有wxBoxSizer和wxFlexGridSizer支持.
我們在來看看wxWidgets都提供我們哪些類來完成控件的佈局任務.
wxSizer, wxGridSizer, wxFlexGridSizer, wxBoxSizer, wxStaticBoxSizer
wxSizer是基類,一般我們都不直接使用.
wxBoxSizer:
可以指定是水平還是垂直方向排列item.只能二者選一.如果需要橫豎混排,就需要嵌套使用.
wxStaticBoxSizer:
和wxBoxSizer一模一樣,就是多了一個static box做爲邊框.
wxGridSizer:
就是表格狀的排布.注意的是,所有的格子的大小都是一樣的.具體的尺寸依賴item中最大的一個.
wxFlexGridSizer:
wxGridSizer的升級版本,每行的高度和每列的寬度是獨立的.具體的大小依賴行/列中最大個高/寬.
下面通過對wxBoxSizer的Add函數分析來詳細說明wxBoxSizer使用方法.
原形如下:
wxSizerItem* Add(wxWindow* window, int proportion = 0,int flag = 0, int
border = 0, wxObject* userData = NULL)
wxSizerItem* Add(wxSizer* sizer, int proportion = 0, int flag = 0, int
border = 0, wxObject* userData = NULL)
一個是針對wxWindow的,一個是嵌套wxSizer用的,其他的參數都是一致的.
參數說明:
proportion:
這個參數是用在wxBoxSizer的.前面說到每個wxBoxSizer是可以指定一個方向的,這個可以認爲是wxBoxSizer的主方向.
如果該參數是1,表示可以在主方向上伸縮需要加入的item.
flag:
指定item邊框的位置(可以用"|"操作符號組合上/下/左/右).
指定item對齊方式(可以用"|"操作符號組合上/下/左/右/垂直居中/水平居中).
還有一個特別的wxEXPAND.指出item在非主方向是否可以伸縮,主方向的伸縮是由proportion指定.這裏還有一個特別說明的(對主方向和非主方向都有效),如果父級的sizer限制了不能伸縮尺寸,子級的sizer是不能更改的,就算設置可以伸縮也是無效的.如果父級的能伸縮,子級的 sizer可以設置爲不能伸縮.
這裏就不舉具體的例子說明了.確實需要可以參考wxWidgets的幫助中的"Topic
overviews"中的"Sizer overview"的"Programming with
wxBoxSizer".本文也是參考"Sizer overview"寫的.