檢視原始碼 wxSizer (wx v2.4.3)
wxSizer
是用於在視窗中佈局子視窗的抽象基底類別。
您不能直接使用 wxSizer
;而是必須使用從它衍生的尺寸器類別之一。目前有 wxBoxSizer
、wxStaticBoxSizer
、wxGridSizer
、wxFlexGridSizer
、wxWrapSizer
(在 wx 中未實作) 和 wxGridBagSizer
。
wxWidgets 中尺寸器使用的佈局演算法與其他 GUI 工具組 (例如 Java 的 AWT、GTK 工具組或 Qt 工具組) 的佈局密切相關。它的基礎是子視窗回報它們的最小所需大小,以及在父視窗大小變更時能夠被延展的能力。
這通常表示程式設計師一開始不會設定對話框的原始大小,而是會為對話框指派一個尺寸器,並查詢此尺寸器以取得建議的大小。尺寸器反過來會查詢其子視窗,這些子視窗可以是普通視窗、空白空間或其他尺寸器,因此可以建構尺寸器的階層結構。請注意,wxSizer
並非衍生自 wxWindow
,因此不會干擾 tab 順序,並且與螢幕上的實際視窗相比,所需的資源非常少。
尺寸器非常適合在 wxWidgets 中使用的原因,在於每個控制項都會回報其自己的最小大小,並且此演算法可以處理不同字型大小或不同平台上不同的視窗 (對話框項目) 大小的問題。例如,如果 Motif 小組件的標準字型以及整體設計比 Windows 需要更多空間,則在 Motif 上,初始對話框大小會自動比在 Windows 上大。
尺寸器也可以用來控制視窗上自訂繪製項目的佈局。add/4
、insert/5
和 prepend/4
函式會傳回新加入的 wxSizerItem
的指標。只需新增所需大小和屬性的空白空間,然後使用 wxSizerItem:getRect/1
方法來判斷繪圖作業應發生的位置。
請注意,尺寸器與子視窗一樣,由程式庫擁有,並將由它刪除,這表示必須在堆積上配置它們。但是,如果您建立尺寸器,但沒有將它新增至另一個尺寸器或視窗,程式庫將無法刪除此類孤立的尺寸器,在這種情況下 (只有這種情況),應該明確地將它刪除。
wxSizer 旗標
wxSizerItem
建構函式和其他函式 (例如 add/4
) 接受的 "flag" 引數是下列旗標的 OR 組合。使用這些旗標定義兩種主要行為。一種是視窗周圍的邊框:邊框參數決定邊框寬度,而此處提供的旗標決定將新增邊框的項目邊。另一個旗標決定當配置給尺寸器的空間變更時,尺寸器項目的行為方式,且在某種程度上取決於所使用的尺寸器類型。
請參閱:尺寸器總覽
wxWidgets 文件:wxSizer
摘要
函式
將子視窗附加到尺寸器。
將間隔子視窗附加到尺寸器。
此基本函式會將不可延展的空間新增至尺寸器的水平和垂直方向。
將可延展的空間新增至尺寸器。
此方法是抽象的,必須由任何衍生類別覆寫。
從尺寸器分離所有子視窗。
從尺寸器分離位置 index
處的項目,而不毀損它。
告訴尺寸器調整 window
的大小,使其客戶區符合尺寸器的最小大小 (會呼叫 ComputeFittingClientSize()
(在 wx 中未實作) 以判斷它)。
告訴尺寸器調整 window
的虛擬大小,以符合尺寸器的最小大小。
尋找位於尺寸器中位置 index
的 wxSizerItem
。
尋找保存指定 window
的 wxSizerItem
。
傳回尺寸器的最小大小。
傳回尺寸器的目前位置。
傳回尺寸器的目前大小。
隱藏位置 index
處的項目。
隱藏子視窗 window
。
在 index
的任何現有項目之前,將子視窗插入尺寸器。
在 index
的任何現有項目之前,將子視窗插入尺寸器。
將不可延展的空間插入尺寸器。
將可延展的空間插入尺寸器。
如果位置 index
處的項目已顯示,則傳回 true。
呼叫此方法以強制重新佈局子視窗,例如在將子視窗新增至尺寸器或從尺寸器移除子視窗 (視窗、其他尺寸器或空間) 時,同時保持目前的維度。
將不可延展的空間加到尺寸器開頭。
將可延展的空間加到尺寸器開頭。
從尺寸器移除尺寸器子視窗並加以毀損。
從尺寸器分離位置 index
處的指定項目,並將其取代為指定的 wxSizerItem
newitem
。
從尺寸器分離指定的 oldwin
,並將其取代為指定的 newwin
。
這是一個為了方便而提供的多載成員函式。它與上述函式的不同之處僅在於它接受的引數。
呼叫此方法以提供尺寸器最小大小。
這是一個為了方便而提供的多載成員函式。它與上述函式的不同之處僅在於它接受的引數。
此方法會先在傳遞給它的 window
上呼叫 fit/2
,然後再呼叫 setSizeHints/2
。
顯示位置 index
處的項目。
顯示或隱藏尺寸器管理的所有項目。
類型
-type wxSizer() :: wx:wx_object().
函式
-spec add(This, Window) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer().
-spec add(This, Width, Height) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Width :: integer(), Height :: integer(); (This, Window, Flags) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(), Flags :: wxSizerFlags:wxSizerFlags(); (This, Window, [Option]) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(), Option :: {proportion, integer()} | {flag, integer()} | {border, integer()} | {userData, wx:wx_object()}.
將子視窗附加到尺寸器。
wxSizer
本身是一個抽象類別,但是您將會實例化以使用它的衍生類別中的參數是等效的,因此在此處進行描述
-spec add(This, Width, Height, [Option]) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Width :: integer(), Height :: integer(), Option :: {proportion, integer()} | {flag, integer()} | {border, integer()} | {userData, wx:wx_object()}; (This, Width, Height, Flags) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Width :: integer(), Height :: integer(), Flags :: wxSizerFlags:wxSizerFlags().
將間隔子視窗附加到尺寸器。
-spec addSpacer(This, Size) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Size :: integer().
此基本函式會將不可延展的空間新增至尺寸器的水平和垂直方向。
更易讀的呼叫方式
請參閱:addSpacer/2
-spec addStretchSpacer(This) -> wxSizerItem:wxSizerItem() when This :: wxSizer().
-spec addStretchSpacer(This, [Option]) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Option :: {prop, integer()}.
將可延展的空間新增至尺寸器。
更易讀的呼叫方式
此方法是抽象的,必須由任何衍生類別覆寫。
在這裡,尺寸器將會執行其子視窗的最小大小的實際計算。
-spec clear(This) -> ok when This :: wxSizer().
相當於 clear(This, [])
。
從尺寸器分離所有子視窗。
如果 delete_windows
為 true,則也會刪除子視窗。
請注意,子尺寸器一律會刪除,這是因為尺寸器擁有其尺寸器子視窗,但不擁有其視窗子視窗 (因為它們已經由其父視窗擁有) 的一般原則所導致的結果。
-spec detach(This, Window) -> boolean() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(); (This, Index) -> boolean() when This :: wxSizer(), Index :: integer().
從尺寸器分離位置 index
處的項目,而不毀損它。
此方法不會導致進行任何佈局或調整大小,請在從尺寸器分離子視窗之後呼叫 layout/1
以更新「螢幕上」的佈局。如果找到並分離子項目,則傳回 true,否則傳回 false。
請參閱:remove/2
-spec fit(This, Window) -> {W :: integer(), H :: integer()} when This :: wxSizer(), Window :: wxWindow:wxWindow().
告訴尺寸器調整 window
的大小,使其客戶區符合尺寸器的最小大小 (會呼叫 ComputeFittingClientSize()
(在 wx 中未實作) 以判斷它)。
這通常在視窗本身的建構函式中完成,請參閱 wxBoxSizer
的描述中的範例。
傳回:新的視窗大小。
-spec fitInside(This, Window) -> ok when This :: wxSizer(), Window :: wxWindow:wxWindow().
告訴尺寸器調整 window
的虛擬大小,以符合尺寸器的最小大小。
這不會變更視窗的螢幕大小,但可能會導致新增/移除/變更檢視管理它的視窗中虛擬區域所需的捲軸。
請參閱
-spec getChildren(This) -> [wxSizerItem:wxSizerItem()] when This :: wxSizer().
-spec getItem(This, Window) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(); (This, Index) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Index :: integer().
尋找位於尺寸器中位置 index
的 wxSizerItem
。
使用參數 recursive
來搜尋子尺寸器。返回指向項目的指標或 NULL。
-spec getItem(This, Window, [Option]) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(), Option :: {recursive, boolean()}.
尋找保存指定 window
的 wxSizerItem
。
使用參數 recursive
來搜尋子尺寸器。返回指向項目的指標或 NULL。
傳回尺寸器的最小大小。
這是所有子元件及其邊框的最小尺寸總和,或是由 setMinSize/3
設定的最小尺寸,取較大者。請注意,返回的值是客戶端尺寸,而不是視窗尺寸。特別是,如果您使用該值來設定頂層視窗的最小或實際尺寸,請使用 wxWindow::SetMinClientSize()
(wx 中未實現) 或 wxWindow:setClientSize/3
,而不是 wxWindow:setMinSize/2
或 wxWindow:setSize/6
。
傳回尺寸器的目前位置。
傳回尺寸器的目前大小。
-spec hide(This, Window) -> boolean() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(); (This, Index) -> boolean() when This :: wxSizer(), Index :: integer().
隱藏位置 index
處的項目。
要使尺寸器項目消失,請使用 hide/3
,然後接著使用 layout/1
。
使用參數 recursive
來隱藏在子尺寸器中找到的元素。如果找到子項目,則返回 true,否則返回 false。
請參閱
-spec hide(This, Window, [Option]) -> boolean() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(), Option :: {recursive, boolean()}.
隱藏子視窗 window
。
要使尺寸器項目消失,請使用 hide/3
,然後接著使用 layout/1
。
使用參數 recursive
來隱藏在子尺寸器中找到的元素。如果找到子項目,則返回 true,否則返回 false。
請參閱
-spec insert(This, Index, Item) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Index :: integer(), Item :: wxSizerItem:wxSizerItem().
-spec insert(This, Index, Width, Height) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Index :: integer(), Width :: integer(), Height :: integer(); (This, Index, Window, Flags) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Index :: integer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(), Flags :: wxSizerFlags:wxSizerFlags(); (This, Index, Window, [Option]) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Index :: integer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(), Option :: {proportion, integer()} | {flag, integer()} | {border, integer()} | {userData, wx:wx_object()}.
在 index
的任何現有項目之前,將子視窗插入尺寸器。
有關其他參數的含義,請參閱 add/4
。
-spec insert(This, Index, Width, Height, [Option]) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Index :: integer(), Width :: integer(), Height :: integer(), Option :: {proportion, integer()} | {flag, integer()} | {border, integer()} | {userData, wx:wx_object()}; (This, Index, Width, Height, Flags) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Index :: integer(), Width :: integer(), Height :: integer(), Flags :: wxSizerFlags:wxSizerFlags().
在 index
的任何現有項目之前,將子視窗插入尺寸器。
有關其他參數的含義,請參閱 add/4
。
-spec insertSpacer(This, Index, Size) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Index :: integer(), Size :: integer().
將不可延展的空間插入尺寸器。
更易讀的方式來呼叫 wxSizer::Insert(index, size, size)。
-spec insertStretchSpacer(This, Index) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Index :: integer().
-spec insertStretchSpacer(This, Index, [Option]) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Index :: integer(), Option :: {prop, integer()}.
將可延展的空間插入尺寸器。
更易讀的方式來呼叫 wxSizer::Insert(0, 0, prop)。
-spec isShown(This, Window) -> boolean() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(); (This, Index) -> boolean() when This :: wxSizer(), Index :: integer().
如果位置 index
處的項目已顯示,則傳回 true。
請參閱
-spec layout(This) -> ok when This :: wxSizer().
呼叫此方法以強制重新佈局子視窗,例如在將子視窗新增至尺寸器或從尺寸器移除子視窗 (視窗、其他尺寸器或空間) 時,同時保持目前的維度。
-spec prepend(This, Item) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Item :: wxSizerItem:wxSizerItem().
-spec prepend(This, Width, Height) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Width :: integer(), Height :: integer(); (This, Window, Flags) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(), Flags :: wxSizerFlags:wxSizerFlags(); (This, Window, [Option]) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(), Option :: {proportion, integer()} | {flag, integer()} | {border, integer()} | {userData, wx:wx_object()}.
與 add/4
相同,但會將項目加到此尺寸器擁有的項目 (視窗、子尺寸器或空間) 清單開頭。
-spec prepend(This, Width, Height, [Option]) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Width :: integer(), Height :: integer(), Option :: {proportion, integer()} | {flag, integer()} | {border, integer()} | {userData, wx:wx_object()}; (This, Width, Height, Flags) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Width :: integer(), Height :: integer(), Flags :: wxSizerFlags:wxSizerFlags().
與 add/4
相同,但會將項目加到此尺寸器擁有的項目 (視窗、子尺寸器或空間) 清單開頭。
-spec prependSpacer(This, Size) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Size :: integer().
將不可延展的空間加到尺寸器開頭。
更易讀的方式來呼叫 wxSizer::Prepend(size, size, 0)。
-spec prependStretchSpacer(This) -> wxSizerItem:wxSizerItem() when This :: wxSizer().
-spec prependStretchSpacer(This, [Option]) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Option :: {prop, integer()}.
將可延展的空間加到尺寸器開頭。
更易讀的方式來呼叫 wxSizer::Prepend(0, 0, prop)。
-spec recalcSizes(This) -> ok when This :: wxSizer().
相當於:layout/1
-spec remove(This, Index) -> boolean() when This :: wxSizer(), Index :: integer(); (This, Sizer) -> boolean() when This :: wxSizer(), Sizer :: wxSizer().
從尺寸器移除尺寸器子視窗並加以毀損。
注意:此方法不會導致任何佈局或大小調整發生,在從尺寸器中移除子元件後,請呼叫 layout/1
來更新「螢幕上」的佈局。
返回:如果找到並移除子項目,則返回 true,否則返回 false。
-spec replace(This, Oldwin, Newwin) -> boolean() when This :: wxSizer(), Oldwin :: wxWindow:wxWindow() | wxSizer:wxSizer(), Newwin :: wxWindow:wxWindow() | wxSizer:wxSizer(); (This, Index, Newitem) -> boolean() when This :: wxSizer(), Index :: integer(), Newitem :: wxSizerItem:wxSizerItem().
從尺寸器分離位置 index
處的指定項目,並將其取代為指定的 wxSizerItem
newitem
。
僅當分離的子元件是尺寸器或間隔器時,才會被刪除 (但如果它是 wxWindow
則不會,因為視窗由其父視窗擁有,而不是尺寸器)。
此方法不會導致任何佈局或大小調整發生,在從尺寸器中替換子元件後,請呼叫 layout/1
來更新「螢幕上」的佈局。
如果找到並移除子項目,則返回 true,否則返回 false。
-spec replace(This, Oldwin, Newwin, [Option]) -> boolean() when This :: wxSizer(), Oldwin :: wxWindow:wxWindow() | wxSizer:wxSizer(), Newwin :: wxWindow:wxWindow() | wxSizer:wxSizer(), Option :: {recursive, boolean()}.
從尺寸器分離指定的 oldwin
,並將其取代為指定的 newwin
。
分離的子視窗 不會
被刪除 (因為視窗由其父視窗擁有,而不是尺寸器)。
使用參數 recursive
在子尺寸器中遞迴搜尋給定的元素。
此方法不會導致任何佈局或大小調整發生,在從尺寸器中替換子元件後,請呼叫 layout/1
來更新「螢幕上」的佈局。
如果找到並移除子項目,則返回 true,否則返回 false。
-spec setDimension(This, Pos, Size) -> ok when This :: wxSizer(), Pos :: {X :: integer(), Y :: integer()}, Size :: {W :: integer(), H :: integer()}.
這是一個為了方便而提供的多載成員函式。它與上述函式的不同之處僅在於它接受的引數。
-spec setDimension(This, X, Y, Width, Height) -> ok when This :: wxSizer(), X :: integer(), Y :: integer(), Width :: integer(), Height :: integer().
呼叫此方法以強制尺寸器採用指定的維度,並因此強制尺寸器擁有的項目根據 add/4
和 prepend/4
方法中參數定義的規則來調整自身大小。
-spec setItemMinSize(This, Window, Width, Height) -> boolean() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(), Width :: integer(), Height :: integer(); (This, Index, Width, Height) -> boolean() when This :: wxSizer(), Index :: integer(), Width :: integer(), Height :: integer().
-spec setMinSize(This, Size) -> ok when This :: wxSizer(), Size :: {W :: integer(), H :: integer()}.
呼叫此方法以提供尺寸器最小大小。
通常,尺寸器會純粹根據其子元件需要多少空間來計算其最小尺寸。在呼叫此方法後,getMinSize/1
將返回其子元件要求的最小尺寸或此處設定的最小尺寸,取較大者。
-spec setMinSize(This, Width, Height) -> ok when This :: wxSizer(), Width :: integer(), Height :: integer().
這是一個為了方便而提供的多載成員函式。它與上述函式的不同之處僅在於它接受的引數。
-spec setSizeHints(This, Window) -> ok when This :: wxSizer(), Window :: wxWindow:wxWindow().
此方法會先在傳遞給它的 window
上呼叫 fit/2
,然後再呼叫 setSizeHints/2
。
只有當 window
實際上是 wxTopLevelWindow
時才有意義,例如 wxFrame
或 wxDialog
,因為 SetSizeHints 僅在這些類別中有效。它在普通視窗或控制項中不起作用。
此方法由 wxWindow:setSizerAndFit/3
隱式使用,它通常在頂層視窗本身的建構函式中被調用 (請參閱 wxBoxSizer
的描述中的範例),如果頂層視窗可調整大小。
-spec setVirtualSizeHints(This, Window) -> ok when This :: wxSizer(), Window :: wxWindow:wxWindow().
相當於:fitInside/2
-spec show(This, Window) -> boolean() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(); (This, Index) -> boolean() when This :: wxSizer(), Index :: integer(); (This, Show) -> ok when This :: wxSizer(), Show :: boolean().
-spec show(This, Window, [Option]) -> boolean() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(), Option :: {show, boolean()} | {recursive, boolean()}; (This, Index, [Option]) -> boolean() when This :: wxSizer(), Index :: integer(), Option :: {show, boolean()}.
顯示位置 index
處的項目。
要使尺寸器項目消失或重新出現,請使用 show/3
,然後接著使用 layout/1
。
如果找到子項目,則返回 true,否則返回 false。
請參閱
顯示或隱藏尺寸器管理的所有項目。