十四、wxWidgets布局之wxBoxSizer

         wxBoxSizer可以垂直或水平布置其子项,具体取决于其构造函数中使用的标志,wxVERTICAL和wxHORIZONTAL。

使用垂直 sizer 时,每个子项都可以居中、向右对齐或向左对齐。

使用水平 sizer 时,每个子项都可以居中、底部对齐或顶部对齐。

        添加子项时,可以设置最小尺寸、边框、对齐、拉伸因子。

        边框与wxLEFT、wxRIGHT、wxBOTTOM、wxTOP、wxALL配合使用。

        wxBoxSizer添加wxBoxSizer参数如下:

Add    (    wxSizer *     sizer,//
int     proportion = 0,//根据wxHORIZONTAL或wxVERTICAL决定该方向是否可拉伸。
int     flag = 0,//标志组合列表,参见附录一
int     border = 0,//边框宽度
wxObject *   userData = NULL //允许将额外的对象附加到 sizer 项,以便在大小信息比比例和标志允许的更复杂时在派生类中使用。
)    

一、边框

class LayoutSimple:public wxFrame
{
public:
    LayoutSimple(const wxString& title);
};

LayoutSimple::LayoutSimple(const wxString& title)
    :wxFrame(NULL,wxID_ANY,title,wxDefaultPosition,wxSize(680,280))
{

    wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);

    wxPanel *midPanel = new wxPanel(this,wxID_ANY);
    midPanel->SetBackgroundColour(
    //midPanel->SetBackgroundColour(wxColour("#ededed"));
    midPanel->SetBackgroundColour(*wxRED);//*wxRED为wxWidgets定义过的颜色

    vbox->Add(midPanel
              ,1        //垂直可拉伸,因为vbox = new wxBoxSizer(wxVERTICAL)是竖向。
              ,wxEXPAND|//水平可拉伸
              wxALL    //wxAll:四周设置边框 wxLEFT wxRIGHT wxTOP wxBOTTOM左右上下设置边框
              ,20       //设置边框宽度
              );
    this->SetSizer(vbox);

    this->Centre();
}
 

二、多个wxBoxSizer组合

class LayoutBoxsizer:public wxFrame
{
public:
    LayoutBoxsizer(const wxString& title);
};


LayoutBoxsizer::LayoutBoxsizer(const wxString& title)
    :wxFrame(NULL,wxID_ANY,title,wxDefaultPosition,wxSize(680,280))
{

    wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
    wxBoxSizer *hbox1= new wxBoxSizer(wxHORIZONTAL);
    wxBoxSizer *hbox2 = new wxBoxSizer(wxHORIZONTAL);

    wxButton *btnOk = new wxButton;
    btnOk->Create(this,wxID_ANY,"OK");
    btnOk->SetTransparent(1);

    wxButton *btnCancel = new wxButton;
    btnCancel->Create(this,wxID_ANY,"Cancel");

    wxPanel *panelHbox = new wxPanel(this,wxID_ANY);
    panelHbox->SetBackgroundColour(*wxLIGHT_GREY);
    hbox1->Add(panelHbox,1,wxEXPAND|wxALL,20);

    hbox2->Add(btnOk,0,wxRIGHT,1);//btnOK按钮右边设置边距
    hbox2->Add(btnCancel);

    vbox->Add(hbox1,1,wxEXPAND);
    vbox->Add(hbox2,0,wxALIGN_RIGHT|wxRIGHT|wxBOTTOM,20);

    this->SetSizer(vbox);

    this->Centre();
}
 

三、复杂一点的例子

 

class LayoutBoxsizer:public wxFrame
{
public:
    LayoutBoxsizer(const wxString& title);

protected:
    void OnQuit(wxCommandEvent& event);
    
};

LayoutBoxsizer::LayoutBoxsizer(const wxString& title)
    :wxFrame(NULL,wxID_ANY,title,wxDefaultPosition,wxSize(680,280))
{
    wxPanel *panel = new wxPanel(this,wxID_ANY);

    wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);

    wxStaticText *st = new wxStaticText(panel,wxID_ANY,"Class Name");
    wxTextCtrl *text = new wxTextCtrl(panel,wxID_ANY);

    wxBoxSizer *boxClassName = new wxBoxSizer(wxHORIZONTAL);
    boxClassName->Add(st,0,wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
    boxClassName->Add(text,1);
    vbox->Add(boxClassName,0,wxEXPAND|wxLEFT|wxRIGHT|wxTOP,10);
    vbox->Add(wxID_ANY,10);//空白框

    wxStaticText *stMatch = new wxStaticText(panel,wxID_ANY,"Matching Classes");
    wxBoxSizer *boxMatch = new wxBoxSizer(wxHORIZONTAL);
    boxMatch->Add(stMatch);
    vbox->Add(boxMatch,0,wxLEFT|wxTOP,10);

    wxTextCtrl *textMatch = new wxTextCtrl(panel,wxID_ANY,"",
                                wxPoint(-1,-1),wxSize(-1,-1),wxTE_MULTILINE);
    wxBoxSizer *boxText = new wxBoxSizer(wxHORIZONTAL);
    boxText->Add(textMatch,1,wxEXPAND);
    vbox->Add(boxText,1,wxLEFT|wxRIGHT|wxEXPAND,10);
    vbox->Add(wxID_ANY,25);//空白框

    wxCheckBox *cb1 = new wxCheckBox(panel,wxID_ANY,"Case Sensitive");
    wxCheckBox *cb2 = new wxCheckBox(panel,wxID_ANY,"Nested Classes");
    wxCheckBox *cb3 = new wxCheckBox(panel,wxID_ANY,"Non_Project Classes");
    wxBoxSizer *boxCK = new wxBoxSizer(wxHORIZONTAL);
    boxCK->Add(cb1,1);
    boxCK->Add(cb2,1);
    boxCK->Add(cb3,1);
    vbox->Add(boxCK,0,wxLEFT,10);
    vbox->Add(wxID_ANY,25);//空白框

    wxButton *btnOK=new wxButton(panel,wxID_ANY,"OK");
    wxButton *btnClose = new wxButton(panel,wxID_ANY,"Close");
    wxBoxSizer *boxBtn = new wxBoxSizer(wxHORIZONTAL);
    boxBtn->Add(btnOK,0);
    boxBtn->Add(btnClose,0,wxLEFT|wxBOTTOM,10);
    vbox->Add(boxBtn,0,wxRIGHT|wxALIGN_RIGHT,10);

    panel->SetSizer(vbox);


    Bind(wxEVT_COMMAND_BUTTON_CLICKED,LayoutBoxsizer::OnQuit,this,btnClose->GetId());

    Center();
}

void LayoutBoxsizer::OnQuit(wxCommandEvent& event)
{
    Close(true);
}
 

附录一、标志列表flag

wxTOP
wxBOTTOM
wxLEFT
wxRIGHT
wxALL
这些标志用于指定边框宽度将应用于 sizer 项目的哪一侧。
wxEXPAND该项目将被扩展以填充分配给该项目的空间。
wxSHAPED该项目将尽可能扩大,同时保持其纵横比。
wxFIXED_MINSIZE通常 wxSizers 将使用 GetAdjustedBestSize() 来确定窗口项的最小尺寸应该是多少,并将使用该尺寸来计算布局。这允许布局在项目发生变化并且其最佳尺寸变得不同时进行调整。如果您希望窗口项保持其开始时的大小,则使用wxFIXED_MINSIZE.
wxRESERVE_SPACE_EVEN_IF_HIDDEN通常 wxSizer 不会为隐藏的窗口或其他项目分配空间。此标志会覆盖此行为,以便为窗口分配足够的空间,即使它不可见。例如,这使得在不调整父对话框大小的情况下动态显示和隐藏控件成为可能。(自 2.8.8 起可用。)
wxALIGN_CENTER
wxALIGN_CENTRE
wxALIGN_LEFT
wxALIGN_RIGHT
wxALIGN_TOP
wxALIGN_BOTTOM
wxALIGN_CENTER_VERTICAL
wxALIGN_CENTRE_VERTICAL
wxALIGN_CENTER_HORIZONTAL
wxALIGNRIZCENTAL
这些wxALIGN_*标志允许您在 sizer 分配给它
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值