[wxWdiget]使用wxBoxSizer编程

本文翻译了官方文档关于wxBoxSizer的内容,讲解如何使用wxBoxSizer创建具有文本框和按钮的对话框。wxBoxSizer允许自定义窗口大小调整、布局对齐和边框设置,以实现灵活的界面布局。示例代码展示了如何创建一个顶部文本框、底部OK和Cancel按钮的对话框,并设置了相应的布局属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用wxBoxSizer编程(按照官方文档翻译,如有不当之处,恕请指正!)


boxsizer基本思想就是让一个窗口的几何布局变得非常简单,比较典型的就是只有一行或者一列,或者是几层结构。

 

举个例子,假如我们要创建一个顶部为文本框,底部为两个按钮的对话框。我们可以把这个对话框看作是具有两层结构的列,顶层的列可以看做是上面为文本框下变为按钮,底层的列可以看做是左侧为ok按钮,右侧为cancel按钮。在很多情况下(特别是Unix下的对话框和正常的框架)主窗口可以根据根据用户要求和子控件的大小来自由调整大小。在我们举得例子中,我们希望文本框能够随着对话窗口大小的改变而改变,而按钮大小却固定不变。另外,所有的控件要使用细边框以保证对话框看起来比较舒服-更糟的要求是-当对话框窗口大小改变时,按钮要始终保持居中显示。

 

Boxsize有一个特性就是它可以朝着两个方向(宽和高)调整大小,但是子控件依照主要调整方向(横向为行)来不均衡分布。在我们举的例子中,我们希望垂直容器的比重扩大只是针对文本区域,而不是按钮区域。而这是由向容器中添加窗口(或另外一个容器)时的比例参数决定的,此参数被当做比重因子,可以设为0或者大于0,设为0就意味着窗口大小不会改变。如果好几个窗口的proportion参数值都大于0,那么proportion参数值要相对于所有窗口的值之和来生效。如果我们添加两个proportion参数值为1的窗口,那么两个窗口大小变化时变化的都一样大,而且总大小都是容器的一半大小。那当列容器的宽度发生改变时我们该怎么办?这个行为是由flags参数(Add()函数的第二个参数(从0开始编号))控制的:0或空指示着窗口将保持原有大小,wxGROW(同wxEXPAND)指示强制窗口跟随容器大小的改变而改变,wxSHAPED参数告诉该窗口按比例调整大小,即保持原有的宽高比。当未使用wxGROW参数时,该窗口的大小可以在可用的空间内指定。wxALIGN_LEFT,wxALIGN_TOP,wxALIGN_RIGHT,wxALIGN_BOTTOM,wxALIGN_CENTER_HORIZONTALwxALIGN_CENTER_VERTICAL按照字面意思描述的那样来对其。WxALIGN_CENTRE(wxALIGN_CENTER)被定义做(wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL)。默认的对齐方式是wxALIGN_LEFT|wxALIGN_TOP

 

如前所述,任何属于容器的窗口可能都会有边框,可以使用wxTOPwxLEFTwxLEFTwxRIGHTwxBOTTOM来指定4条边的哪一条使用边框,或者用wxALL来设置全部4个方向都有边框(你也可以用wxNORTHwxWEST等替代)。可以用二进制|运算符把边框标志位和对齐标志位或在一起,用作上面提到的的Add()函数的第三个参数。边框的大小可以用Add()函数的第四个参数来设置。这样,整个容器的行为和子控件就都可用Add()函数的后三个参数来控制。

 

//示例代码

MyDialog::MyDialog(wxFrame *parent, wxWindowID id, const wxString &title )
        : wxDialog(parent, id, title, wxDefaultPosition, wxDefaultSize,
                   wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
  wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );

  // create text ctrl with minimal size 100x60
  topsizer->Add(
    new wxTextCtrl( this, -1, "My text.", wxDefaultPosition, wxSize(100,60), wxTE_MULTILINE),
    1,            // 垂直方向可拉伸
    wxEXPAND |    // 水平方向自动填充
    wxALL,        //   四周都有边框
    10 );         // 边框宽度为10


  wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
  button_sizer->Add(
     new wxButton( this, wxID_OK, "OK" ),
     0,           // 水平不可拉伸
     wxALL,       // 四周边框
     10 );        // 边框宽度为10
  button_sizer->Add(
     new wxButton( this, wxID_CANCEL, "Cancel" ),
     0,           // 水平不可拉伸
     wxALL,       // 四周边框
     10 );        // 边框宽度为10
topsizer->Add( button_sizer, 0, // 横向不可拉伸 wxALIGN_CENTER ); //无边框,居中对齐 SetSizer( topsizer ); // 设置topsizer作为布局 topsizer->SetSizeHints( this ); // 设置大小为最小尺寸 }

另外还可以通过wxSizeFlags的方法来为wxSizer指定flags参数。这个类极大的减轻了向wxSizer传递参数的负担。以下代码就是前面那个例子用wxSizeFlags的实现方式:

 

 

MyDialog::MyDialog(wxFrame *parent, wxWindowID id, const wxString &title )
        : wxDialog(parent, id, title, wxDefaultPosition, wxDefaultSize,
                   wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
  wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );


  topsizer->Add(
    new wxTextCtrl( this, -1, "My text.", wxDefaultPosition, wxSize(100,60), wxTE_MULTILINE),
    wxSizerFlags(1).Align().Expand().Border(wxALL, 10));

  wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );


  button_sizer->Add(
     new wxButton( this, wxID_OK, "OK" ),
     wxSizerFlags(0).Align().Border(wxALL, 10));       

  button_sizer->Add(
     new wxButton( this, wxID_CANCEL, "Cancel" ),
     wxSizerFlags(0).Align().Border(wxALL, 10));    

  topsizer->Add(
     button_sizer,
     wxSizerFlags(0).Center() ); 

  SetSizer( topsizer );  

  topsizer->SetSizeHints( this ); 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值