除了伊戈尔上面所说的,我还要补充两点。首先,在将项目添加到 sizer 时,我会使用wxSizerFlags。我认为这确实有助于澄清用于添加项目的所有数字和选项的作用。其次,通常只有一个项目的大小调整器(例如logOutputSizer)没有任何用途。我只想摆脱它。
考虑到这两点,要回答你的问题,有必要使用比例参数和 Expand 方法来获取你想要的布局。例如:
wxBoxSizer *frameSizer = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer *deckListLeftSizer = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *deckListRightSizer = new wxBoxSizer(wxVERTICAL);
// 10 inputs on left
for ( int i = 0; i < 10; i++ )
{
wxTextCtrl *textCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString);
deckInputCastables.push_back(textCtrl);
deckListLeftSizer->Add(textCtrl, wxSizerFlags(1).Expand());
}
// 10 inputs on right
for ( int i = 0; i < 10; i++ )
{
wxTextCtrl *textCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString);
deckInputLands.push_back(textCtrl);
deckListRightSizer->Add(textCtrl, wxSizerFlags(1).Expand());
}
logOutput = new wxStaticText(this, wxID_ANY, "Output Terminal");
logOutput->SetBackgroundColour(*wxRED);
frameSizer->Add(deckListLeftSizer, wxSizerFlags(1).Expand());
frameSizer->Add(deckListRightSizer, wxSizerFlags(1).Expand());
frameSizer->Add(logOutput, wxSizerFlags(1).Expand());
frameSizer->Fit(this);
SetSizer(frameSizer);
产生这个输出。
这是一个开始,但它把所有东西都捆绑在一起,没有分离。要在项目之间添加一点分隔,您可以对 sizer 标志使用 Border 方法。但是,如果您只使用wxALL 为每个项目添加所有边框,您将获得多个双边框。例如,如果一个项目同时具有下边框,而其下方的项目具有上边框,则项目之间将有双边框。考虑到这一点,以下代码将在每个项目周围放置一个边框:
wxBoxSizer *frameSizer = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer *deckListLeftSizer = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *deckListRightSizer = new wxBoxSizer(wxVERTICAL);
// 10 inputs on left
for ( int i = 0; i < 10; i++ )
{
wxTextCtrl *textCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString);
deckInputCastables.push_back(textCtrl);
deckListLeftSizer->Add(textCtrl, wxSizerFlags(1).Expand().Border(wxBOTTOM));
}
// 10 inputs on right
for ( int i = 0; i < 10; i++ )
{
wxTextCtrl *textCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString);
deckInputLands.push_back(textCtrl);
deckListRightSizer->Add(textCtrl, wxSizerFlags(1).Expand().Border(wxBOTTOM));
}
logOutput = new wxStaticText(this, wxID_ANY, "Output Terminal");
logOutput->SetBackgroundColour(*wxRED);
frameSizer->Add(deckListLeftSizer, wxSizerFlags(1).Expand().Border(wxTOP|wxLEFT|wxRIGHT));
frameSizer->Add(deckListRightSizer, wxSizerFlags(1).Expand().Border(wxTOP|wxRIGHT));
frameSizer->Add(logOutput, wxSizerFlags(1).Expand().Border(wxTOP|wxBOTTOM|wxRIGHT));
frameSizer->Fit(this);
SetSizer(frameSizer);
这会产生这样的布局:
有许多不同的方法可以重新排列边框选项以防止出现双边框,上面的示例只是一种可能性。
最后,使用面板将框架中的所有项目分组通常是个好主意。它提供了更好看的背景,并允许您使用 Tab 键在控件之间移动。这是一个展示这个想法的最后一个例子:
wxPanel* panel = new wxPanel(this,wxID_ANY);
wxBoxSizer *panelSizer = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer *deckListLeftSizer = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *deckListRightSizer = new wxBoxSizer(wxVERTICAL);
// 10 inputs on left
for ( int i = 0; i < 10; i++ )
{
wxTextCtrl *textCtrl = new wxTextCtrl(panel, wxID_ANY, wxEmptyString);
deckInputCastables.push_back(textCtrl);
deckListLeftSizer->Add(textCtrl, wxSizerFlags(1).Expand().Border(wxBOTTOM));
}
// 10 inputs on right
for ( int i = 0; i < 10; i++ )
{
wxTextCtrl *textCtrl = new wxTextCtrl(panel, wxID_ANY, wxEmptyString);
deckInputLands.push_back(textCtrl);
deckListRightSizer->Add(textCtrl, wxSizerFlags(1).Expand().Border(wxBOTTOM));
}
logOutput = new wxStaticText(panel, wxID_ANY, "Output Terminal");
logOutput->SetBackgroundColour(*wxRED);
panelSizer->Add(deckListLeftSizer, wxSizerFlags(1).Expand().Border(wxTOP|wxLEFT|wxRIGHT));
panelSizer->Add(deckListRightSizer, wxSizerFlags(1).Expand().Border(wxTOP|wxRIGHT));
panelSizer->Add(logOutput, wxSizerFlags(1).Expand().Border(wxTOP|wxBOTTOM|wxRIGHT));
panel->SetSizerAndFit(panelSizer);
this->Fit();
这会产生这样的布局:
面板不需要使用大小调整器,因为当框架只有一个子级时,该子级会自动扩展以填充框架的所有空间。