wxWidgets Sizers:如何让 sizers 在调整大小时正确运行

sgb*_*own 5 c++ user-interface wxwidgets

我目前正在学习在 Microsoft Visual Studio C++ 中使用 wxWidgets,并且我认为我已经了解了 Sizer 的概念。但是,我似乎无法让它们在调整大小时按照我想要的方式运行。我正在遵循一个教程(我似乎放错了链接,但它非常简单),其目的是创建一个带有可扩展文本框的对话框窗口,其下方有两个按钮应保持大致居中。我的窗口代码如下,可以在对话框窗口的构造函数中找到:

vertSizer = new wxBoxSizer(wxVERTICAL); // Create vertical (parent) sizer, will contain text box and child sizer
vertSizer->Add(
    new wxTextCtrl(this, -1, "My text", wxDefaultPosition, wxSize(100,80), wxTE_MULTILINE),
    1, // vertically stretchable
    wxEXPAND | wxALL, // horizontally stretchable, borders all around
    10); // Add text box to parent sizer

horizSizer = new wxBoxSizer(wxHORIZONTAL); // Make child sizer, will contain buttons
wxSizerFlags ButtonFlags(1); // Make controls stretch hoizontally (to cover entire sizer area)
ButtonFlags.Expand().Center().Border(wxALL,10); // Make controls expand vertically, add border
horizSizer->Add(new wxButton(this,wxID_OK,"OK"), ButtonFlags); // Add first button
horizSizer->Add(new wxButton(this, ID_Cancel,"Cancel"), ButtonFlags); // Add second button

vertSizer->Add(horizSizer); // Add child sizer to parent sizer
SetSizerAndFit(vertSizer);
Run Code Online (Sandbox Code Playgroud)

显示的窗口看起来正确(窗口顶部有一个大文本框,其下方并排有两个间隔适当的按钮)。但是,当调整窗口大小时,文本框会垂直和水平扩展(预期行为),但按钮保持在原位,左对齐(不需要的行为)。(很抱歉无法发布照片;我准备了几张照片,但我无法以我的声誉发布它们。)

初始化时的格式很棒,但是我会在调整大小时保持该格式。意思是,我希望文本框下方的两个按钮保持在窗口中间,仍然并排(尽管随着窗口变大,它们之间的距离增加是可以接受的)。或者,我希望按钮水平增加尺寸,以便每个按钮占据文本框下方区域的一半。

如果已经有人提出类似的问题,我深表歉意,但在我的研究中,我尚未在该网站上找到满意的答案。

任何对此的帮助将不胜感激。谢谢你!

Kri*_*ske 3

您需要告诉外框 sizer 它也应该扩展水平子 sizer:

vertSizer->Add(horizSizer, 0, wxEXPAND);
Run Code Online (Sandbox Code Playgroud)

第二个参数 0 告诉垂直调整器仅水平扩展子调整器。对于 box sizer,传递 0 作为第二个参数,wxEXPAND 作为第三个参数(的一部分)将确保添加的子控件或 sizer 在“其他”方向扩展,即,对于垂直 sizer,子级水平扩展而对于水平调整器,子项会垂直扩展。

正如您从文本框中知道的那样,传递 1 作为第二个参数将在两个方向上扩展。