对于一个平台无关的设计来说,要考虑同一个控件在不同的平台上可能有不同的外观和尺寸。这意味着使用绝对大小和位置来进行窗口布局几乎是行不通的。但是wxWidgets的布局控件,可以灵活的进行非常复杂的窗口布局。而目前wxWidgets总共支持五类布局控件,每一种布局控件或者用来实现一种特殊的布局方式,或者用来实现和布局相关的一种特殊的功能比如在某些控件周围围绕一个静态的文本框。
控件都会有自己的最小大小、边界、对齐方式、伸缩因子(默认为0,如果为1则在窗口空间不够的情况下,缩小为原来的一半)
使用布局控件进行编程:
1、使用wxBoxSizer进行编程
MyFrame::MyFrame(const wxString& title)
: wxFrame(NULL, wxID_ANY, wxT("Hello wxWidgets"), wxPoint(50,50), wxSize(800,600))
{
// set icon for application
SetIcon(wxIcon(mondrian_xpm));
wxBoxSizer *top_sizer = new wxBoxSizer(wxVERTICAL);
// 创建一个最小大小为100的多行文本框x60
top_sizer->Add( new wxTextCtrl(this,
wxID_ANY, "My test", wxDefaultPosition, wxSize(100, 60), wxTE_MULTILINE),
1, // 垂直方向可缩放因子为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);
top_sizer->Add( button_sizer,
0, // 垂直方向不可缩放
wxALIGN_CENTER );// 无边框并且居中对齐
SetSizer(top_sizer); // 绑定对话框和布局控件
top_sizer->Fit(this); // 调用对话框大小
top_sizer->SetSizeHints(this); // 设置对话框最小大小
// Create a status bar just for fun
CreateStatusBar(1);
SetStatusText(wxT("Welcome to wxWidgets!"));
}
2、使用wxStaticBoxSizer
wxStaticBoxSizer除了实现wxBoxSizer的功能,另外还在整个布局的范围以外增加了一个静态的边框wxStaticBox,整个wxStaticBox需要手动创建并且在wxStaticBoxSizer的构造函数中作为参数传入。
#define ID_CHECKBOX 10031
MyFrame::MyFrame(const wxString& title)
: wxFrame(NULL, wxID_ANY, wxT("Hello wxWidgets"), wxPoint(50,50), wxSize(800,600))
{
// set icon for application
SetIcon(wxIcon(mondrian_xpm));
wxBoxSizer *top_level = new wxBoxSizer(wxVERTICAL);
wxStaticBox *static_bos = new wxStaticBox(this, wxID_ANY, wxT("General settings"));
wxStaticBoxSizer *static_box_sizer = new wxStaticBoxSizer(static_bos, wxVERTICAL);
top_level->Add(static_box_sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
wxCheckBox *check_box = new wxCheckBox( this, ID_CHECKBOX, wxT("&Show splash screen"),
wxDefaultPosition, wxDefaultSize);
static_box_sizer->Add(check_box, 0, wxALIGN_LEFT | wxALL, 5);
SetSizer(top_level);
top_level->Fit(this);
top_level->SetSizeHints(this);
// Create a status bar just for fun
CreateStatusBar(1);
SetStatusText(wxT("Welcome to wxWidgets!"));
}
还有两种用Grid来布局的方式,对本人而言用处已经不算很大了。