查看源代码 wxSizer (wx v2.4.3)
wxSizer
是用于在窗口中布局子窗口的抽象基类。
您不能直接使用 wxSizer
;相反,您必须使用从它派生的 sizer 类之一。目前有 wxBoxSizer
、wxStaticBoxSizer
、wxGridSizer
、wxFlexGridSizer
、wxWrapSizer
(在 wx 中未实现)和 wxGridBagSizer
。
wxWidgets 中 sizer 使用的布局算法与其他 GUI 工具包(如 Java 的 AWT、GTK 工具包或 Qt 工具包)中的布局密切相关。它基于以下思想:各个子窗口报告其最小所需大小以及在父窗口大小更改时可以拉伸的能力。
这通常意味着程序员一开始不设置对话框的原始大小,而是为对话框分配一个 sizer,并查询此 sizer 以获取建议的大小。sizer 反过来会查询其子项,子项可以是普通窗口、空白空间或其他 sizer,因此可以构建 sizer 的层次结构。请注意,wxSizer
不是从 wxWindow
派生的,因此不会干扰标签排序,并且与屏幕上的真实窗口相比,需要非常少的资源。
Sizer 非常适合在 wxWidgets 中使用的原因是,每个控件都会报告其自己的最小大小,并且该算法可以毫无问题地处理不同平台上的字体大小差异或不同的窗口(对话框项)大小。例如,如果 Motif 小部件的标准字体以及整体设计比 Windows 需要更多的空间,则 Motif 上的初始对话框大小将自动大于 Windows。
Sizer 还可以用于控制窗口上自定义绘制项的布局。add/4
、insert/5
和 prepend/4
函数返回指向新添加的 wxSizerItem
的指针。只需添加所需大小和属性的空白空间,然后使用 wxSizerItem:getRect/1
方法确定应在何处进行绘制操作。
请注意,sizer 与子窗口一样,归库所有,并将由库删除,这意味着它们必须在堆上分配。但是,如果您创建一个 sizer 但不将其添加到另一个 sizer 或窗口,则库将无法删除此类孤立的 sizer,在这种情况下,并且仅在这种情况下,应显式删除它。
wxSizer 标志
wxSizerItem
构造函数和其他函数(例如 add/4
)接受的“flag”参数是以下标志的 OR 组合。使用这些标志定义了两种主要行为。一种是窗口周围的边框:border 参数确定边框宽度,而此处给出的标志确定将在项目的哪一侧添加边框。另一个标志确定当分配给 sizer 的空间更改时 sizer 项的行为,并且在某种程度上取决于使用的特定 sizer 类型。
请参阅: 概述 sizer
wxWidgets 文档:wxSizer
摘要
函数
将子项追加到 sizer。
将间隔符子项追加到 sizer。
此基本函数将不可拉伸的空间添加到 sizer 的水平和垂直方向。
将可拉伸的空间添加到 sizer。
此方法是抽象的,必须由任何派生类覆盖。
从 sizer 中分离所有子项。
从 sizer 中分离位置 index
的项,而不销毁它。
告诉 sizer 调整 window
的大小,使其客户端区域与 sizer 的最小大小匹配(调用 ComputeFittingClientSize()
(在 wx 中未实现)来确定它)。
告诉 sizer 调整 window
的虚拟大小以匹配 sizer 的最小大小。
查找位于 sizer 中位置 index
的 wxSizerItem
。
查找保存给定 window
的 wxSizerItem
。
返回 sizer 的最小大小。
返回 sizer 的当前位置。
返回 sizer 的当前大小。
隐藏位置 index
的项。
隐藏子项 window
。
在 index
处任何现有项之前将子项插入到 sizer。
在 index
处任何现有项之前将子项插入到 sizer。
将不可拉伸的空间插入到 sizer。
将可拉伸的空间插入到 sizer。
如果位置 index
的项显示,则返回 true。
调用此函数以强制重新布局子项,例如在将子项添加到 sizer 或从 sizer 中删除子项(窗口、其他 sizer 或空间)后,同时保持当前尺寸。
将不可拉伸的空间预先添加到 sizer。
将可拉伸的空间预先添加到 sizer。
从 sizer 中移除 sizer 子项并销毁它。
从 sizer 中分离位置 index
的给定项,并将其替换为给定的 wxSizerItem
newitem
。
从 sizer 中分离给定的 oldwin
,并将其替换为给定的 newwin
。
这是一个重载的成员函数,为方便起见而提供。它与上面的函数仅在它接受的参数方面有所不同。
调用此函数以赋予 sizer 最小大小。
这是一个重载的成员函数,为方便起见而提供。它与上面的函数仅在它接受的参数方面有所不同。
此方法首先调用 fit/2
,然后在传递给它的 window
上调用 setSizeHints/2
。
显示 index
处的项。
显示或隐藏 sizer 管理的所有项。
类型
-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()}.
将子项追加到 sizer。
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().
将间隔符子项追加到 sizer。
-spec addSpacer(This, Size) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Size :: integer().
此基本函数将不可拉伸的空间添加到 sizer 的水平和垂直方向。
更易读的调用方式
请参阅:addSpacer/2
-spec addStretchSpacer(This) -> wxSizerItem:wxSizerItem() when This :: wxSizer().
-spec addStretchSpacer(This, [Option]) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Option :: {prop, integer()}.
将可拉伸的空间添加到 sizer。
更易读的调用方式
此方法是抽象的,必须由任何派生类覆盖。
在此,sizer 将执行其子项的最小大小的实际计算。
-spec clear(This) -> ok when This :: wxSizer().
等效于 clear(This, [])
。
从 sizer 中分离所有子项。
如果 delete_windows
为 true,则还将删除子窗口。
请注意,子 sizer 始终会被删除,这是 sizer 拥有其 sizer 子项的一般原则的结果,但不拥有其窗口子项(因为它们已归其父窗口所有)。
-spec detach(This, Window) -> boolean() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(); (This, Index) -> boolean() when This :: wxSizer(), Index :: integer().
从 sizer 中分离位置 index
的项,而不销毁它。
此方法不会导致任何布局或调整大小发生,在从 sizer 中分离子项后,调用 layout/1
以更新“屏幕上”的布局。如果找到并分离了子项,则返回 true,否则返回 false。
请参阅:remove/2
-spec fit(This, Window) -> {W :: integer(), H :: integer()} when This :: wxSizer(), Window :: wxWindow:wxWindow().
告诉 sizer 调整 window
的大小,使其客户端区域与 sizer 的最小大小匹配(调用 ComputeFittingClientSize()
(在 wx 中未实现)来确定它)。
这通常在窗口本身的构造函数中完成,请参阅 wxBoxSizer
的描述中的示例。
返回:新的窗口大小。
-spec fitInside(This, Window) -> ok when This :: wxSizer(), Window :: wxWindow:wxWindow().
告诉 sizer 调整 window
的虚拟大小以匹配 sizer 的最小大小。
这不会改变窗口的屏幕大小,但可能会导致添加/删除/更改用于查看管理它的窗口中的虚拟区域的滚动条。
请参阅
-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().
查找位于 sizer 中位置 index
的 wxSizerItem
。
使用参数 recursive
也在子 sizer 中搜索。返回指向项的指针或 NULL。
-spec getItem(This, Window, [Option]) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(), Option :: {recursive, boolean()}.
查找保存给定 window
的 wxSizerItem
。
使用参数 recursive
也在子 sizer 中搜索。返回指向项的指针或 NULL。
返回 sizer 的最小大小。
这要么是所有子项及其边框的组合最小尺寸,要么是由 setMinSize/3
设置的最小尺寸,取两者中较大的值。请注意,返回的值是客户区尺寸,而不是窗口尺寸。特别是,如果您使用该值来设置顶级窗口的最小尺寸或实际尺寸,请使用 wxWindow::SetMinClientSize()
(在 wx 中未实现)或 wxWindow:setClientSize/3
,而不是 wxWindow:setMinSize/2
或 wxWindow:setSize/6
。
返回 sizer 的当前位置。
返回 sizer 的当前大小。
-spec hide(This, Window) -> boolean() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(); (This, Index) -> boolean() when This :: wxSizer(), Index :: integer().
隐藏位置 index
的项。
要使 sizer 项目消失,请使用 hide/3
,然后使用 layout/1
。
使用参数 recursive
来隐藏在子 sizer 中找到的元素。如果找到子项,则返回 true,否则返回 false。
请参阅
-spec hide(This, Window, [Option]) -> boolean() when This :: wxSizer(), Window :: wxWindow:wxWindow() | wxSizer:wxSizer(), Option :: {recursive, boolean()}.
隐藏子项 window
。
要使 sizer 项目消失,请使用 hide/3
,然后使用 layout/1
。
使用参数 recursive
来隐藏在子 sizer 中找到的元素。如果找到子项,则返回 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
处任何现有项之前将子项插入到 sizer。
有关其他参数的含义,请参见 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
处任何现有项之前将子项插入到 sizer。
有关其他参数的含义,请参见 add/4
。
-spec insertSpacer(This, Index, Size) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Index :: integer(), Size :: integer().
将不可拉伸的空间插入到 sizer。
调用 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()}.
将可拉伸的空间插入到 sizer。
调用 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().
调用此函数以强制重新布局子项,例如在将子项添加到 sizer 或从 sizer 中删除子项(窗口、其他 sizer 或空间)后,同时保持当前尺寸。
-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
相同,但将项预先添加到此 sizer 拥有的项(窗口、子 sizer 或空间)列表的开头。
-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
相同,但将项预先添加到此 sizer 拥有的项(窗口、子 sizer 或空间)列表的开头。
-spec prependSpacer(This, Size) -> wxSizerItem:wxSizerItem() when This :: wxSizer(), Size :: integer().
将不可拉伸的空间预先添加到 sizer。
调用 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()}.
将可拉伸的空间预先添加到 sizer。
调用 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().
从 sizer 中移除 sizer 子项并销毁它。
注意:此方法不会导致任何布局或调整大小发生,从 sizer 中删除子项后,请调用 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().
从 sizer 中分离位置 index
的给定项,并将其替换为给定的 wxSizerItem
newitem
。
仅当分离的子项是 sizer 或 spacer 时,才会删除该子项(但如果它是 wxWindow
则不会删除,因为窗口由其父窗口拥有,而不是 sizer)。
此方法不会导致任何布局或调整大小发生,从 sizer 中替换子项后,请调用 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()}.
从 sizer 中分离给定的 oldwin
,并将其替换为给定的 newwin
。
分离的子窗口不会
被删除(因为窗口由其父窗口拥有,而不是 sizer)。
使用参数 recursive
在子 sizer 中递归搜索给定的元素。
此方法不会导致任何布局或调整大小发生,从 sizer 中替换子项后,请调用 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().
调用此函数以强制 sizer 采用给定的尺寸,从而强制 sizer 拥有的项根据 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()}.
调用此函数以赋予 sizer 最小大小。
通常,sizer 会纯粹基于其子项需要的空间量来计算其最小尺寸。调用此方法后,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().
此方法首先调用 fit/2
,然后在传递给它的 window
上调用 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
处的项。
要使 sizer 项目消失或重新出现,请使用 show/3
,然后使用 layout/1
。
如果找到子项,则返回 true,否则返回 false。
请参阅
显示或隐藏 sizer 管理的所有项。