【问题标题】:wxWidgets Sizers: How to get sizers to behave properly on resizewxWidgets Sizer:如何让 sizer 在调整大小时表现正常
【发布时间】:2014-08-06 16:53:49
【问题描述】:

我目前正在学习在 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);

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

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

如果有人问过类似的问题,我深表歉意,但我在研究中没有在这个网站上找到满意的答案。

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

【问题讨论】:

    标签: c++ user-interface wxwidgets


    【解决方案1】:

    你需要告诉外框尺寸器它也应该扩展水平子尺寸器:

    vertSizer->Add(horizSizer, 0, wxEXPAND);
    

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

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

    【讨论】:

    • 非常感谢!这是解决方案的一部分,但是我发现,除了使用将第一个尺寸调整器添加到第二个尺寸的方法之外,我还需要在两个按钮的两侧放置一个带有 horizSizer->AddStretchSpacer() 的拉伸垫片。
    • 哦,我忽略了你说按钮应该居中的部分。在这种情况下,最简单的解决方案是执行 vertSizer->Add(horizSizer, 0, wxALIGN_CENTER_HORIZONTAL)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多