如何让一个 sizer 扩展到整个 wxNotebook 页面?

How can I make a sizer expand to the whole wxNotebook page?

我有一个 wxNotebook 添加了两个页面。每个页面使用 wxFlexGridSizer 来管理每个页面上的各种小部件。

第一页有三列小部件,第二页只有两列。第一页比第二页宽。

笔记本的大小已调整为其最宽页面(第一个页面)的大小。但是,在第二页上,我也想让 sizer 扩展以填满整个页面。相反,它只是调整大小以适应该页面上的小部件。

所以我的问题是: 如何让第二页的sizer扩展到整个notebook宽度,由第一页的宽度决定?

我试过调用父 wxNotebookLayout() 函数,但这没有帮助。

编辑:

wxNotebook *notebook = new wxNotebook(this, wxID_ANY);

wxPanel* pageOne = new wxPanel(notebook, wxID_ANY);
wxFlexGridSizer* sizer = new wxFlexGridSizer(3);
wxSizerFlags flags = wxSizerFlags().Align(wxLEFT).Border(wxRIGHT, 5);
wxStaticText* label = new wxStaticText(pageOne, wxID_ANY, wxT("Label 1"));
sizer->Add(label, flags);
label = new wxStaticText(pageOne, wxID_ANY, wxT("Label 2"));
sizer->Add(label, flags);
wxSpinCtrlDouble* value = new wxSpinCtrlDouble(pageOne, wxID_ANY, wxT("50.0"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
sizer->Add(value, flags);
pageOne->SetSizer(sizer);
notebook->AddPage(pageOne, wxT("Page 1"));

wxPanel* pageTwo = new wxPanel(notebook, wxID_ANY);
sizer = new wxFlexGridSizer(2);
flags = wxSizerFlags().Align(wxLEFT).Border(wxRIGHT, 5);
label = new wxStaticText(pageTwo, wxID_ANY, wxT("Label 1"));
sizer->Add(label, flags);
value = new wxSpinCtrlDouble(pageTwo, wxID_ANY, wxT("50.0"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
sizer->Add(value, flags);
pageTwo->SetSizer(sizer);
notebook->AddPage(pageTwo, wxT("Page 2"));

topLevelSizer->Add(notebook);
this->SetSizerAndFit(topLevelSizer);

您只需要进行 2 处小改动。首先使用第二页上的 flex grid sizer,你需要调用 AddGrowableCol(1)。这意味着第二列可以扩展。 (索引从 0 开始,因此第 1 列是第二列。)

其次,您需要在添加双旋转控制时使用稍微不同的 sizer 标志。例如,

sizer->Add(value, wxSizerFlags(0).Expand().Border(wxRIGHT, 5));

这是您发布的包含这两项更改的代码段:

wxNotebook *notebook = new wxNotebook(this, wxID_ANY);

wxPanel* pageOne = new wxPanel(notebook, wxID_ANY);
wxFlexGridSizer* sizer = new wxFlexGridSizer(3);
wxSizerFlags flags = wxSizerFlags().Align(wxLEFT).Border(wxRIGHT, 5);
wxStaticText* label = new wxStaticText(pageOne, wxID_ANY, wxT("Label 1"));
sizer->Add(label, flags);
label = new wxStaticText(pageOne, wxID_ANY, wxT("Label 2"));
sizer->Add(label, flags);
wxSpinCtrlDouble* value = new wxSpinCtrlDouble(pageOne, wxID_ANY, wxT("50.0"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
sizer->Add(value, flags);
pageOne->SetSizer(sizer);
notebook->AddPage(pageOne, wxT("Page 1"));

wxPanel* pageTwo = new wxPanel(notebook, wxID_ANY);
sizer = new wxFlexGridSizer(2);
sizer->AddGrowableCol(1);
flags = wxSizerFlags().Align(wxLEFT).Border(wxRIGHT, 5);
label = new wxStaticText(pageTwo, wxID_ANY, wxT("Label 1"));
sizer->Add(label, flags);
value = new wxSpinCtrlDouble(pageTwo, wxID_ANY, wxT("50.0"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
sizer->Add(value, wxSizerFlags(0).Expand().Border(wxRIGHT, 5));
pageTwo->SetSizer(sizer);
notebook->AddPage(pageTwo, wxT("Page 2"));

topLevelSizer->Add(notebook);

将让旋转控件展开以占据所有剩余 space,同时匹配第一页的边框。