使用布局控件進(jìn)行窗口布局
窗口布局基礎(chǔ)
為了在各種環(huán)境中都能使窗口擁有合適的位置和大小,可能需要在OnSize事件中計(jì)算每一個(gè)窗口的大小并設(shè)置新位置,當(dāng)然使用窗口布局控件可以更方便地實(shí)現(xiàn)
如果選擇使用布局控件,可以通過自己編寫或者使用工具來創(chuàng)建,也可以使用XRC文件布局的定義保存在一個(gè)xml文件中,可以被應(yīng)用程序動(dòng)態(tài)加載,也可以通過wxrc工具將其編譯成C++源文件
窗口布局控件
和QT十分類似,窗口布局控件可以詢問窗口需要的合適大小
圖中使用了垂直布局和水平布局將控件放置到合適的位置
布局控件的通用特征
所有的布局控件都是容器,不管怎樣排放子元素,必然有以下通用的特征
- 最小大小:布局控件中的每個(gè)元素都有計(jì)算自己最小大小的能力,但是對(duì)于類似列表框這樣的控件,必須清晰的指明大小,因?yàn)樗鼈儧]有自然大小
- 邊界:每個(gè)元素都應(yīng)該有一個(gè)邊界,邊界的最小大小必須被顯式地指定
- 對(duì)齊方式:每個(gè)元素都可以以居中或?qū)R某個(gè)邊的方式放置,對(duì)齊可以為水平或垂直
- 伸縮因子:如果一個(gè)布局控件的空間大于它所有子元素需要的空間,可以指定元素的伸縮因子分割多余的空間
使用布局控件進(jìn)行編程
首先創(chuàng)建一個(gè)頂層布局控件,使用wxWindow::SetSizer函數(shù)將它和頂層窗口綁定,可以在頂層布局控件中放置窗口或其他控件元素,如果想頂層窗口的大小適合所有控件需要的大小,可以調(diào)用wxSizer::Fit函數(shù),想頂層窗口在執(zhí)行過程中不小于初始尺寸,可以使用wxSizer::SetHints函數(shù)
除了依次調(diào)用上面三個(gè)函數(shù),可以直接通過調(diào)用wxWindow::SetSizerAndFit函數(shù)來達(dá)到同樣效果
如果在frame窗口里使用了panel,只使用了一個(gè)panel,所有其他的窗口和控件都是panel的子窗口,那么已經(jīng)知道了怎么將這個(gè)panel合適地放置在frame上了,只需要對(duì)panel子窗口使用布局控件。如果frame窗口中有多個(gè)panel,首先不得不為frame綁定一個(gè)布局控件對(duì)panel進(jìn)行布局,然后再在panel子窗口中進(jìn)行布局
使用wxBoxSizer進(jìn)行編程
wxBoxSizer可以將容器子元素進(jìn)行橫向或者縱向的排列,以及指定對(duì)齊方向
使用wxBoxSizer的Add方法增加子元素:
//增加窗口
void Add(wxWindow *window, int stretch = 0, int flags = 0, int border = 0);
//增加布局控件
void Add(wxSizer *window, int stretch = 0, int flags = 0, int border = 0);
第一個(gè)參數(shù)是增加的窗口或布局控件
第二個(gè)參數(shù)是縮放因子
第三個(gè)參數(shù)是比特位列表,指示子元素的對(duì)齊和邊界行為,默認(rèn)的值為wxALIGN_LEFT|wxALIGN_TOP,即為左對(duì)齊上對(duì)齊
第四個(gè)參數(shù)指定邊界間隔的大小
也可以直接增加一段空白:
//增加一段空白舊方法
void Add(int width, int height, int stretch = 0, int flags = 0, int border = 0);
//增加一段固定大小的空白
void AddSpacer(int size);
//增加一個(gè)可縮放的空白
void AddStretchSpacer(int stretch = 1);
第二種方法相當(dāng)于調(diào)用Add(size, size, 0);
第三種方法相當(dāng)于調(diào)用Add(0, 0, stretch)
使用wxStaticBoxSizer編程
wxStaticBoxSizer繼承自wxBoxSizer布局控件,除了wxBoxSizer的功能,還在整個(gè)布局以外增加了一個(gè)靜態(tài)邊框wxStaticBox,這個(gè)wxStaticBox需要手動(dòng)創(chuàng)建后作為參數(shù)傳入wxStaticBoxSizer構(gòu)造函數(shù),Add函數(shù)與wxBoxSizer的Add函數(shù)用法相同
使用wxGridSizer編程
wxGridSizer布局控件可以以二維表的方式排列子元素,每個(gè)表格大小都是相同的,等于最長(zhǎng)的表格的長(zhǎng)度和高度,創(chuàng)建一個(gè)wxGridSizer需要指定行數(shù)和列數(shù),以及行間距和列間距
使用wxFlexGridSizer編程
wxFlexGridSizer采用二維表進(jìn)行布局,和wxGridSizer不同,不要求所有的表格大小一樣,只要求同一列上所有表格寬度是相同的,同一行上所有表格高度是相同的,還可以給行和列指定是否縮放,當(dāng)整個(gè)布局控件大小發(fā)生變化時(shí),可以指定某些行或者列隨著整個(gè)布局控件的縮放而縮放
wxFlexGridSizer可以指定行數(shù),列數(shù)額外的垂直間距和水平間距,調(diào)用Add函數(shù)的方法和wxBoxSizer相同
初始情況看不出第一列可以改變大小的效果,改變對(duì)話框的水平方向大小可以在第一列占用額外增加的空間,并且第一列的子元素也居中顯示
使用wxGridBagSizer編程
模擬現(xiàn)實(shí)世界中的固定位置和大小的基于布局控件的布局,將子元素按照一個(gè)虛擬的網(wǎng)格進(jìn)行排序,子元素的位置是通過wxGBPosition對(duì)象指定的,對(duì)象大小使用wxGBSpan指定,對(duì)象的大小不僅限于一個(gè)網(wǎng)格
創(chuàng)建wxGridBagSizer的可選參數(shù)包括垂直和水平方向的間隔,Add函數(shù)需要提供的參數(shù)包括子元素的位置和大小,另外的可選標(biāo)記和邊框大小參數(shù)的意義和wxBoxSizer是一樣的
更多關(guān)于布局的話題
對(duì)話框單位
盡管布局控件可以讓基本控件的大小隨著平臺(tái)進(jìn)行相應(yīng)的改變,但是有些情況下,還是需要手動(dòng)指定控件的大小,如果希望手動(dòng)指定的大小也隨著平臺(tái)變化,應(yīng)該使用對(duì)話框單位來代替像素單位
平臺(tái)自適應(yīng)布局
不同平臺(tái)風(fēng)格存在不同,要做到不同平臺(tái)上按鈕順序的自適應(yīng),需要使用wxStdDialogButtonSizer布局控件,這個(gè)控件繼承自wxBoxSizer
這個(gè)布局控件構(gòu)造函數(shù)沒有參數(shù),要增加按鈕可以使用兩種方法:
1.傳遞按鈕指針給AddButton函數(shù),或者使用SetAffirmativeButton,SetNegativeButton,and SetCancelButton來設(shè)置按鈕的特征,如果使用AddButton,那么按鈕應(yīng)使用下面的這些標(biāo)識(shí)符:wxID_OK,wxID_YES,wxID_CANCEL,wxID_NO,wxID_SAVE,wxID_APPLY,wxID_HELP和wxID_CONTEXT_HELP,在所有按鈕都增加到布局控件以后,調(diào)用Realize函數(shù)以便布局控件調(diào)整按鈕的順序:
2.或者可以使用wxDialog::CreateButtonSizer函數(shù),基于一些按鈕標(biāo)記的列表來自動(dòng)創(chuàng)建平臺(tái)自適應(yīng)的按鈕,并將其放在布局控件中文章來源:http://www.zghlxwxcb.cn/news/detail-597847.html
動(dòng)態(tài)布局
當(dāng)需要?jiǎng)討B(tài)更改對(duì)話框的布局時(shí),比如按鈕按下的時(shí)候顯示更多的選項(xiàng),可以使用平常的辦法,調(diào)用wxWindow::Show函數(shù)來隱藏某個(gè)控件,不過wxSizer也提供了一個(gè)單獨(dú)的方法,可以使用wxSizer::Show函數(shù)并且傳遞false函數(shù),告訴wxSizer不要計(jì)算其中的窗口大小,調(diào)用這個(gè)函數(shù)需要使用wxSizer::Layout函數(shù)來強(qiáng)制更新對(duì)應(yīng)的窗口文章來源地址http://www.zghlxwxcb.cn/news/detail-597847.html
到了這里,關(guān)于【wxWidgets】使用布局控件進(jìn)行窗口布局的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!