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 分配给它 |