檢視原始碼 wxLayoutAlgorithm (wx v2.4.3)
wxLayoutAlgorithm
實作 MDI 或 SDI 框架中子視窗的佈局。
它會向框架的子元件發送一個 wxCalculateLayoutEvent
(wx 中未實作) 事件,要求它們提供關於其大小的資訊。對於 MDI 父框架,此演算法會將剩餘空間分配給 MDI 用戶端視窗(其中包含 MDI 子框架)。
對於 SDI (一般) 框架,會指定一個「主要」視窗佔據剩餘空間。
由於使用事件系統,此技術可以應用於任何視窗,這些視窗不一定「知道」佈局類別(wxWindow
中沒有虛擬函式參考 wxLayoutAlgorithm
或其事件)。但是,您可能希望為子視窗使用 wxSashLayoutWindow
,因為此類別為所需的事件提供處理程式,並提供用於指定視窗所需大小的存取器。您可以選擇使用基底類別中的 sash 行為,使視窗可讓使用者調整大小。
wxLayoutAlgorithm
通常用於 IDE(整合開發環境)應用程式,其中除了 MDI 用戶端視窗或其他主要編輯視窗之外,還有數個可調整大小的視窗。可調整大小的視窗可能包括工具列、專案視窗和用於顯示錯誤和警告訊息的視窗。
當視窗接收到 OnCalculateLayout 事件時,它應該在給定的事件物件中呼叫 SetRect,使其為舊的提供矩形減去視窗佔用的任何空間。它也應相應地設定其自身大小。wxSashLayoutWindow::OnCalculateLayout
(wx 中未實作) 會產生一個 OnQueryLayoutInfo 事件,並將其發送到自身以確定視窗的方向、對齊方式和大小,這些資訊會從應用程式設定的內部成員變數中取得。
此演算法的工作方式是從等於整個框架用戶端區域的矩形開始。它會迭代框架子元件,產生 wxLayoutAlgorithm::OnCalculateLayout 事件,這些事件會減去視窗大小,並傳回剩餘的矩形供下一個視窗處理。假設(由 wxSashLayoutWindow::OnCalculateLayout
(wx 中未實作)) 視窗根據其指定的方向,延伸框架用戶端的完整維度。例如,水平視窗會延伸框架用戶端區域剩餘部分的完整寬度。在另一個方向上,視窗將固定為 wxLayoutAlgorithm::OnQueryLayoutInfo 指定的任何大小。對齊設定會使視窗「黏附」到剩餘用戶端區域的左側、頂部、右側或底部。此方案表示視窗建立的順序很重要。假設您希望在框架頂部有一個額外的工具列、在 MDI 用戶端視窗左側有一個專案視窗,以及在狀態列上方有一個輸出視窗。因此,您應該依此順序建立視窗:工具列、輸出視窗、專案視窗。這可確保工具列和輸出視窗佔用頂部和底部空間,然後中間剩餘的高度用於專案視窗。
wxLayoutAlgorithm
完全獨立於 wxLayoutAlgorithm::OnCalculateLayout 選擇如何解釋視窗的大小和對齊方式。因此,您可以實作一個具有新的 wxLayoutAlgorithm::OnCalculateLayout 事件處理程式的不同視窗類別,該處理程式具有更複雜的視窗佈局方式。例如,它可以允許指定是否在指定的方向上發生延伸,而不是總是假設延伸。(這可以,而且可能應該新增到現有的實作中)。
注意:wxLayoutAlgorithm
與 wxLayoutConstraints
(wx 中未實作)無關。它是指定佈局的替代方法,對於這種佈局,一般約束系統並不適用。
參見
wxWidgets 文件:wxLayoutAlgorithm
摘要
類型
-type wxLayoutAlgorithm() :: wx:wx_object().
函式
-spec destroy(This :: wxLayoutAlgorithm()) -> ok.
銷毀物件
-spec layoutFrame(This, Frame) -> boolean() when This :: wxLayoutAlgorithm(), Frame :: wxFrame:wxFrame().
-spec layoutFrame(This, Frame, [Option]) -> boolean() when This :: wxLayoutAlgorithm(), Frame :: wxFrame:wxFrame(), Option :: {mainWindow, wxWindow:wxWindow()}.
佈局一般框架的子元件。
mainWindow
設定為佔據剩餘空間。此函式僅呼叫 layoutWindow/3
。
-spec layoutMDIFrame(This, Frame) -> boolean() when This :: wxLayoutAlgorithm(), Frame :: wxMDIParentFrame:wxMDIParentFrame().
-spec layoutMDIFrame(This, Frame, [Option]) -> boolean() when This :: wxLayoutAlgorithm(), Frame :: wxMDIParentFrame:wxMDIParentFrame(), Option :: {rect, {X :: integer(), Y :: integer(), W :: integer(), H :: integer()}}.
佈局 MDI 父框架的子元件。
如果 rect
非 NULL,則給定的矩形將用作起點,而不是框架的用戶端區域。MDI 用戶端視窗設定為佔據剩餘空間。
-spec layoutWindow(This, Parent) -> boolean() when This :: wxLayoutAlgorithm(), Parent :: wxWindow:wxWindow().
-spec layoutWindow(This, Parent, [Option]) -> boolean() when This :: wxLayoutAlgorithm(), Parent :: wxWindow:wxWindow(), Option :: {mainWindow, wxWindow:wxWindow()}.
佈局一般框架或其他視窗的子元件。
mainWindow
設定為佔據剩餘空間。如果未指定,則最後一個回應查詢模式中計算佈局事件的視窗將取得剩餘空間(也就是說,非查詢 OnCalculateLayout 事件不會傳送到此視窗,而且視窗將設定為剩餘大小)。
-spec new() -> wxLayoutAlgorithm().
預設建構子。