网易网站建设,做网站费用怎么记分录,百度指数下载手机版,wordpress视频类主题继上一篇【wxWidgest教程】界面布局#xff1a;自动布局之后#xff0c;本篇将进入介绍界面布局器wxSizer的使用方法。wxWidgets教程完整目录 调整器使用的布局算法与其他GUI工具包#xff08;如Java的AWT、GTK工具包或Qt工具包#xff09;中的布局系统几乎相同。它基…继上一篇【wxWidgest教程】界面布局自动布局之后本篇将进入介绍界面布局器wxSizer的使用方法。wxWidgets教程完整目录调整器使用的布局算法与其他GUI工具包如Java的AWT、GTK工具包或Qt工具包中的布局系统几乎相同。它基于单个子窗口报告其最小所需大小以及在父窗口大小发生更改时拉伸。这通常意味着您不设置对话框的启动大小而是为对话框分配一个调整器并询问这个调整器的建议大小调整器将依次查询其子级可以是普通窗体、空白区域或其他调整器以便可以构造调整器的层次结构。使调整器非常适合在wxWidgets中使用的原因是每个控件都报告自己的最小大小并且算法可以处理不同平台上字体大小或不同窗口对话框项大小的差异而不会出现问题。例如如果标准字体以及Linux/GTK小部件的总体设计需要比Windows上更多的空间那么Linux/GTK上的初始对话框大小将自动比Windows上的大。调整器同时也是一类容器用于布局并包含子控件。使用wxWindow::Show()方法可以像隐藏任何控件一样隐藏大小调整器中包含的控件。不过wxSizer还提供了一个单独的方法可以告诉调整器在其大小计算中不要考虑该控件。调用boolShow(wxWindow*window,boolshowtrue,boolrecursivefalse ),然后必须调用调整器上的void wxSizer::Layout()来强制更新。这在隐藏部分窗口时很有用因为您可以避免从调整器中删除控件以后再添加它们仅wxBoxSizer和wxFlexGridSizer支持该功能。一、一维布局一wxBoxSizerwxBoxSizer基于这样一个认识即窗口通常以非常简单的基本几何形式布局通常是一行或一列。wxBoxSizer可以垂直或水平布局其子项具体取决于其构造函数wxBoxSizer(intorient)中使用的标志是。orient为wxVERTICAL使用垂直方向排列每个子项都可以居中、右对齐或左对齐。相应地orient为wxHORIZONTAL水平方向排列每个子项都可以居中、在底部对齐或在顶部对齐。拉伸因子用于主方向确定子项水平或垂拉伸的程度。下面的示例演示wxBoxSizer的使用例子同时使用了两种标志设置方式。MyFrame::MyFrame(wxWindowID id,const wxString title,const wxPoint pos, const wxSize size ,long style , const wxString name):wxFrame(NULL,id,title,pos,size,style,name){ //ctor wxSizerFlags sizerFlag; sizerFlag.Border(wxALL,1).Proportion(1).Expand(); wxBoxSizer* outBoxnew wxBoxSizer(wxVERTICAL); wxBoxSizer* hBox1new wxBoxSizer(wxHORIZONTAL); hBox1-Add(new wxButton(this,wxID_ANY,Test Button 1),sizerFlag); hBox1-Add(new wxButton(this,wxID_ANY,Test Button 2),1,wxEXPAND|wxALL); wxBoxSizer* hBox2new wxBoxSizer(wxHORIZONTAL); hBox2-Add(new wxTextCtrl(this,wxID_ANY,hbox2 text box1, wxDefaultPosition,wxDefaultSize, wxTE_MULTILINE),sizerFlag); hBox2-Add(new wxTextCtrl(this,wxID_ANY,hbox2 text box2, wxDefaultPosition,wxDefaultSize, wxTE_MULTILINE),2,wxEXPAND|wxALL); hBox2-Add(new wxTextCtrl(this,wxID_ANY,hbox2 text box3, wxDefaultPosition,wxDefaultSize, wxTE_MULTILINE),1,wxEXPAND|wxALL); outBox-Add(hBox1,sizerFlag); outBox-Add(hBox2,wxSizerFlags(1).Expand().Border(wxALL)); SetSizerAndFit(outBox); }二wxStaticBoxSizerwxStaticBoxSizer与wxBoxSizer相同但由一个静态框包围。下面是一个示例MyFrame::MyFrame(wxWindowID id,const wxString title):wxFrame(NULL,id,title){ //ctor wxBoxSizer *topSizernew wxBoxSizer(wxVERTICAL); wxStaticBoxSizer* sizer1new wxStaticBoxSizer(wxHORIZONTAL,this,wxStaticBoxSizer); sizer1-Add(new wxCheckBox(this,wxID_ANY,option 1),wxALL|wxEXPAND); sizer1-Add(new wxCheckBox(this,wxID_ANY,option 2),wxALL|wxEXPAND); sizer1-Add(new wxCheckBox(this,wxID_ANY,option 3),wxALL|wxEXPAND); sizer1-Add(new wxCheckBox(this,wxID_ANY,option 4),wxALL|wxEXPAND); wxStaticBoxSizer* sizer2new wxStaticBoxSizer(wxHORIZONTAL,this,wxStaticBoxSizer); sizer2-Add(new wxCheckBox(this,wxID_ANY,option 1),wxALL|wxEXPAND); sizer2-Add(new wxCheckBox(this,wxID_ANY,option 2),wxALL|wxEXPAND); sizer2-Add(new wxCheckBox(this,wxID_ANY,option 3),wxALL|wxEXPAND); sizer2-Add(new wxCheckBox(this,wxID_ANY,option 4),wxALL|wxEXPAND); topSizer-Add(sizer1,wxSizerFlags(1).Expand().Border(wxALL)); topSizer-Add(sizer2,wxSizerFlags(1).Expand().Border(wxALL)); SetSizerAndFit(topSizer); }三wxWrapSizer一个wxWrapSizer将它的子项排成一行就像wxBoxSizer一样只要在主方向有可用的空间不同的是当空间占满后wxWrapSizer将在次方向上添加新行或列。二、二维布局一wxGridSizerwxGridSizer是一个二维的调整器。所有子项都被赋予相同的大小其大小与最大子项所需的最小大小相同。在本例中是左下边框中的文本控件。列数或行数都是固定的如果添加了新的子项则网格大小调整器将按各自的其他方向增长MyFrame::MyFrame(wxWindowID id , const wxString title) : wxFrame( nullptr, id, title){ //ctor wxGridSizer *sizernew wxGridSizer(4,3,wxSize(1,1)); wxString btnNames[]{0,1,2,3,4,5,6,7,8,9,,-}; for(wxString bn:btnNames){ sizer-Add(new wxButton(this,wxWindow::NewControlId(),bn), wxSizerFlags(1).Expand().Border(wxALL,1)); } SetSizerAndFit(sizer); }在wxSizer的基础上wxGridSizer增加了如下函数用于设置网络的行列数及行列之间的间隔voidSetRows(introws);voidSetCols(introws);voidSetVGap(intgap);voidSetHGap(intgap);二wxFlexGridSizer从wxGridSizer派生的另一个二维调整器。每一列的宽度和每一行的高度是根据各自最大的子级的最小要求分别计算的。此外如果为调整器分配的大小不同于它所请求的大小则可以将列和行声明为可扩展的。下面的示例显示的对话框与上面的示例相同但使用的是wxFlexGridSizerMyFrame::MyFrame(wxWindowID id ,const wxString title) : wxFrame( nullptr, id, title) { //ctor wxFlexGridSizer *sizernew wxFlexGridSizer(4,3,wxSize(1,1)); wxString btnNames[]{0,1,2,3,4, 535; 2*222444 \r\nf(n)100*n, 6,7,8,9,,-}; for(wxString bn:btnNames){ sizer-Add(new wxButton(this,wxWindow::NewControlId(),bn),wxSizerFlags(1).Expand().Border(wxALL,1)); } SetSizerAndFit(sizer); }在wxGridSizer的基础上wxFlexGridSizer增加了以下操作设置行列拉伸因子如同一维布局中子控件的proportion参数一样在二维弹性布局中行和列也具有拉伸因子当调整器中有额外的空间时该拉伸因子决定了行或列如何扩展以填充剩余空间。通过voidAddGrowableCol(size_tidx,intproportion0)和voidAddGrowableRow(size_tidx,intproportion0)函数可以设置行或列的拉伸因子。idx:从0开始计数标识行号或列号proportion:行或列的空间占比大小。如果取消空间占比则可调用voidRemoveGrowableCol(size_tidx)和voidRemoveGrowableRow(size_tidx)函数。boolIsRowGrowable(size_tidx)和boolIsColGrowable(size_tidx)可判断特定行列是否可拉伸。设置拉伸方向从wxWidgets 2.5.0开始wxFlexGridSizer还可以在一个方向上等长调整控件大小而在另一个方向则相对灵活不要求长度相等。可以调用voidSetFlexibleDirection(intdirection)设置这个相对灵活的方向参数direction可以是wxVERTICAL、wxHORIZONTAL或wxBOTH。而在另一个方向则需要调用voidSetNonFlexibleGrowMode(wxFlexSizerGrowModemode)设置子控件填充剩余空间的方式。mode可以设置为下面的值表 11wxFlexSizerGrowMode定义wxFLEX_GROWMODE_NONESizer不会在非弹性方向上拉伸其子控件wxFLEX_GROWMODE_SPECIFIEDSizer使用AddGrowtableCol()和AddGrowtableRow()设置的proportion来决定列或行的最小大小这是默认值wxFLEX_GROWMODE_ALLSizer平等地拉伸所有列或行与proportion参数无关三wxGridBagSizerwxGridBagSizer可以像wxFlexGridSizer一样在虚拟网格中布局控件。与之不同的是该调整器还能够使用wxGBPosition显式地指定以col、row为坐标指定的网格位置以及使用wxGBSpan指定子控件占用的行数、列数类似于HTMLtable中的colspan和rowspan属性。该调整器的子项添加操作与其父类不同wxSizerItem*Add(wxWindow*window,const wxGBPositionpos,const wxGBSpanspanwxDefaultSpan,intflag0,intborder0,wxObject*userDataNULL);三、总结本文介绍了wxWidgets中wxSizer布局器的使用方法。wxSizer采用基于控件最小大小和拉伸因子的布局算法支持跨平台自适应。文章详细讲解了一维布局器(wxBoxSizer、wxStaticBoxSizer、wxWrapSizer)和二维布局器(wxGridSizer、wxFlexGridSizer、wxGridBagSizer)的特点及使用场景。重点说明了弹性布局中的行列拉伸因子设置、控件隐藏方法等实用功能并通过代码示例展示了各类布局器的实际应用。还有一些界面布局的高级用法如标准布局、弹簧等后续将进一步讨论。