福州自助建站,无锡装修公司哪家口碑最好,wordpress getfooter,自学网站建设多久使用布局控件进行窗口布局
窗口布局基础
为了在各种环境中都能使窗口拥有合适的位置和大小#xff0c;可能需要在OnSize事件中计算每一个窗口的大小并设置新位置#xff0c;当然使用窗口布局控件可以更方便地实现 如果选择使用布局控件#xff0c;可以通过自己编写或者使用…使用布局控件进行窗口布局
窗口布局基础
为了在各种环境中都能使窗口拥有合适的位置和大小可能需要在OnSize事件中计算每一个窗口的大小并设置新位置当然使用窗口布局控件可以更方便地实现 如果选择使用布局控件可以通过自己编写或者使用工具来创建也可以使用XRC文件布局的定义保存在一个xml文件中可以被应用程序动态加载也可以通过wxrc工具将其编译成C源文件
窗口布局控件
和QT十分类似窗口布局控件可以询问窗口需要的合适大小 图中使用了垂直布局和水平布局将控件放置到合适的位置
布局控件的通用特征
所有的布局控件都是容器不管怎样排放子元素必然有以下通用的特征
最小大小布局控件中的每个元素都有计算自己最小大小的能力但是对于类似列表框这样的控件必须清晰的指明大小因为它们没有自然大小边界每个元素都应该有一个边界边界的最小大小必须被显式地指定对齐方式每个元素都可以以居中或对齐某个边的方式放置对齐可以为水平或垂直伸缩因子如果一个布局控件的空间大于它所有子元素需要的空间可以指定元素的伸缩因子分割多余的空间
使用布局控件进行编程
首先创建一个顶层布局控件使用wxWindow::SetSizer函数将它和顶层窗口绑定可以在顶层布局控件中放置窗口或其他控件元素如果想顶层窗口的大小适合所有控件需要的大小可以调用wxSizer::Fit函数想顶层窗口在执行过程中不小于初始尺寸可以使用wxSizer::SetHints函数 除了依次调用上面三个函数可以直接通过调用wxWindow::SetSizerAndFit函数来达到同样效果 如果在frame窗口里使用了panel只使用了一个panel所有其他的窗口和控件都是panel的子窗口那么已经知道了怎么将这个panel合适地放置在frame上了只需要对panel子窗口使用布局控件。如果frame窗口中有多个panel首先不得不为frame绑定一个布局控件对panel进行布局然后再在panel子窗口中进行布局
使用wxBoxSizer进行编程
wxBoxSizer可以将容器子元素进行横向或者纵向的排列以及指定对齐方向 使用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);第一个参数是增加的窗口或布局控件 第二个参数是缩放因子 第三个参数是比特位列表指示子元素的对齐和边界行为默认的值为wxALIGN_LEFT|wxALIGN_TOP即为左对齐上对齐 第四个参数指定边界间隔的大小 也可以直接增加一段空白
//增加一段空白旧方法
void Add(int width, int height, int stretch 0, int flags 0, int border 0);
//增加一段固定大小的空白
void AddSpacer(int size);
//增加一个可缩放的空白
void AddStretchSpacer(int stretch 1);第二种方法相当于调用Add(size, size, 0); 第三种方法相当于调用Add(0, 0, stretch)
使用wxStaticBoxSizer编程
wxStaticBoxSizer继承自wxBoxSizer布局控件除了wxBoxSizer的功能还在整个布局以外增加了一个静态边框wxStaticBox这个wxStaticBox需要手动创建后作为参数传入wxStaticBoxSizer构造函数Add函数与wxBoxSizer的Add函数用法相同
使用wxGridSizer编程
wxGridSizer布局控件可以以二维表的方式排列子元素每个表格大小都是相同的等于最长的表格的长度和高度创建一个wxGridSizer需要指定行数和列数以及行间距和列间距
使用wxFlexGridSizer编程
wxFlexGridSizer采用二维表进行布局和wxGridSizer不同不要求所有的表格大小一样只要求同一列上所有表格宽度是相同的同一行上所有表格高度是相同的还可以给行和列指定是否缩放当整个布局控件大小发生变化时可以指定某些行或者列随着整个布局控件的缩放而缩放 wxFlexGridSizer可以指定行数列数额外的垂直间距和水平间距调用Add函数的方法和wxBoxSizer相同 初始情况看不出第一列可以改变大小的效果改变对话框的水平方向大小可以在第一列占用额外增加的空间并且第一列的子元素也居中显示
使用wxGridBagSizer编程
模拟现实世界中的固定位置和大小的基于布局控件的布局将子元素按照一个虚拟的网格进行排序子元素的位置是通过wxGBPosition对象指定的对象大小使用wxGBSpan指定对象的大小不仅限于一个网格 创建wxGridBagSizer的可选参数包括垂直和水平方向的间隔Add函数需要提供的参数包括子元素的位置和大小另外的可选标记和边框大小参数的意义和wxBoxSizer是一样的
更多关于布局的话题
对话框单位
尽管布局控件可以让基本控件的大小随着平台进行相应的改变但是有些情况下还是需要手动指定控件的大小如果希望手动指定的大小也随着平台变化应该使用对话框单位来代替像素单位
平台自适应布局
不同平台风格存在不同要做到不同平台上按钮顺序的自适应需要使用wxStdDialogButtonSizer布局控件这个控件继承自wxBoxSizer 这个布局控件构造函数没有参数要增加按钮可以使用两种方法 1.传递按钮指针给AddButton函数或者使用SetAffirmativeButton,SetNegativeButton,and SetCancelButton来设置按钮的特征如果使用AddButton那么按钮应使用下面的这些标识符wxID_OK,wxID_YES,wxID_CANCEL,wxID_NO,wxID_SAVE,wxID_APPLY,wxID_HELP和wxID_CONTEXT_HELP在所有按钮都增加到布局控件以后调用Realize函数以便布局控件调整按钮的顺序 2.或者可以使用wxDialog::CreateButtonSizer函数基于一些按钮标记的列表来自动创建平台自适应的按钮并将其放在布局控件中
动态布局
当需要动态更改对话框的布局时比如按钮按下的时候显示更多的选项可以使用平常的办法调用wxWindow::Show函数来隐藏某个控件不过wxSizer也提供了一个单独的方法可以使用wxSizer::Show函数并且传递false函数告诉wxSizer不要计算其中的窗口大小调用这个函数需要使用wxSizer::Layout函数来强制更新对应的窗口