查看源代码 wxLayoutAlgorithm (wx v2.4.3)

wxLayoutAlgorithm 实现了 MDI 或 SDI 框架中子窗口的布局。

它向框架的子窗口发送一个 wxCalculateLayoutEvent 事件(wx 中未实现),要求它们提供有关其大小的信息。对于 MDI 父框架,该算法将剩余空间分配给 MDI 客户端窗口(其中包含 MDI 子框架)。

对于 SDI(普通)框架,指定一个“主”窗口来占用剩余空间。

由于使用了事件系统,因此可以将此技术应用于任何窗口,这些窗口不一定“了解”布局类(wxWindow 中没有虚函数引用 wxLayoutAlgorithm 或其事件)。但是,您可能希望为子窗口使用 wxSashLayoutWindow,因为此类为所需的事件提供了处理程序,并提供了指定窗口所需大小的访问器。可以有选择地使用基类中的窗格行为,使窗口可由用户调整大小。

wxLayoutAlgorithm 通常用于 IDE(集成开发环境)应用程序,其中除了 MDI 客户端窗口或其他主要编辑窗口外,还有多个可调整大小的窗口。可调整大小的窗口可能包括工具栏、项目窗口以及用于显示错误和警告消息的窗口。

当窗口收到 OnCalculateLayout 事件时,它应在给定的事件对象中调用 SetRect,使其等于提供的旧矩形减去窗口占用的空间。它还应相应地设置自身大小。wxSashLayoutWindow::OnCalculateLayout(wx 中未实现)生成一个 OnQueryLayoutInfo 事件,该事件会发送给自己,以确定窗口的方向、对齐方式和大小,这些信息从应用程序设置的内部成员变量中获取。

该算法的工作方式是首先使用等于整个框架客户端区域的矩形。它遍历框架的子项,生成 wxLayoutAlgorithm::OnCalculateLayout 事件,这些事件会减去窗口大小并返回剩余的矩形以供下一个窗口处理。假设(由 wxSashLayoutWindow::OnCalculateLayout(wx 中未实现))窗口根据其指定的方向拉伸框架客户端的整个维度。例如,水平窗口将拉伸框架客户端区域剩余部分的整个宽度。在另一个方向上,窗口将固定为 wxLayoutAlgorithm::OnQueryLayoutInfo 指定的任何大小。对齐设置将使窗口“粘附”到剩余客户端区域的左侧、顶部、右侧或底部。此方案意味着窗口创建的顺序很重要。假设您希望在框架顶部有一个额外的工具栏,在 MDI 客户端窗口的左侧有一个项目窗口,并在状态栏上方有一个输出窗口。因此,您应按此顺序创建窗口:工具栏、输出窗口、项目窗口。这确保工具栏和输出窗口占用顶部和底部的空间,然后中间的剩余高度用于项目窗口。

wxLayoutAlgorithm 与 wxLayoutAlgorithm::OnCalculateLayout 选择解释窗口大小和对齐方式的方式完全无关。因此,您可以使用新的 wxLayoutAlgorithm::OnCalculateLayout 事件处理程序来实现不同的窗口类,该处理程序具有更复杂的窗口布局方式。例如,它可能允许指定是否在指定方向上发生拉伸,而不是始终假设拉伸。(这可以,并且可能应该,添加到现有实现中)。

注意:wxLayoutAlgorithmwxLayoutConstraints(wx 中未实现)无关。它是指定不适合正常约束系统的布局的另一种方式。

另请参见

wxWidgets 文档:wxLayoutAlgorithm

摘要

函数

销毁对象

布局普通框架的子项。

布局 MDI 父框架的子项。

布局普通框架或其他窗口的子项。

默认构造函数。

类型

-type wxLayoutAlgorithm() :: wx:wx_object().

函数

-spec destroy(This :: wxLayoutAlgorithm()) -> ok.

销毁对象

链接到此函数

layoutFrame(This, Frame)

查看源代码
-spec layoutFrame(This, Frame) -> boolean() when This :: wxLayoutAlgorithm(), Frame :: wxFrame:wxFrame().

等效于 layoutFrame(This, Frame, [])

-spec layoutFrame(This, Frame, [Option]) -> boolean()
                     when
                         This :: wxLayoutAlgorithm(),
                         Frame :: wxFrame:wxFrame(),
                         Option :: {mainWindow, wxWindow:wxWindow()}.

布局普通框架的子项。

mainWindow 被设置为占用剩余空间。此函数只是调用 layoutWindow/3

链接到此函数

layoutMDIFrame(This, Frame)

查看源代码
-spec layoutMDIFrame(This, Frame) -> boolean()
                        when This :: wxLayoutAlgorithm(), Frame :: wxMDIParentFrame:wxMDIParentFrame().

等效于 layoutMDIFrame(This, Frame, [])

-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 客户端窗口被设置为占用剩余空间。

链接到此函数

layoutWindow(This, Parent)

查看源代码
-spec layoutWindow(This, Parent) -> boolean()
                      when This :: wxLayoutAlgorithm(), Parent :: wxWindow:wxWindow().

等效于 layoutWindow(This, Parent, [])

-spec layoutWindow(This, Parent, [Option]) -> boolean()
                      when
                          This :: wxLayoutAlgorithm(),
                          Parent :: wxWindow:wxWindow(),
                          Option :: {mainWindow, wxWindow:wxWindow()}.

布局普通框架或其他窗口的子项。

mainWindow 被设置为占用剩余空间。如果未指定,则最后响应查询模式下的计算布局事件的窗口将获得剩余空间(即,不会向该窗口发送非查询 OnCalculateLayout 事件,并且该窗口将设置为剩余大小)。

-spec new() -> wxLayoutAlgorithm().

默认构造函数。