为什么我的 window 被 wxBoxSizer 调整到小于它的最小尺寸

Why is my window resized to smaller than its minimum size by a wxBoxSizer

我使用

创建我的应用程序的主要 window
Main::Main() : wxFrame(nullptr, wxID_ANY, "Test", wxPoint(64, 64), wxSize(1024, 768))

在这个 window 中,我放置了另一个类型为 View 的 window,其构造函数如下所示:

View::View(wxWindow* parent) : wxHVScrolledWindow(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE)

视图是通过m_view = new View(this);

在main的构造函数中添加到main中的

这给了我一个看起来像这样的应用程序:

这正是我所期望的。我需要向主 window 添加更多控件,因此我想开始使用 sizer 以独立于分辨率的方式布置它们。但是,如果我只是在我的视图周围添加这个简单的 sizer:

auto sizer = new wxBoxSizer(wxHORIZONTAL);
m_view = new View(this);
sizer->Add(m_view, 1, wxEXPAND);
SetSizerAndFit(sizer);

我最终得到这个:

我曾希望我的观点能够扩展并适合主要观点 window,但这并没有发生。我做错了什么?

我使用的是 wxWidgets 3.14 版。

只需调用 SetSizer 而不是 SetSizerAndFitSetSizerAndFitdocumentation 表示:

This method calls SetSizer() and then wxSizer::SetSizeHints() which sets the initial window size to the size needed to accommodate all sizer elements and sets the minimal size to the same size

然而,滚动的 window 通常不会有最小尺寸,因为如果它的当前尺寸低于给定尺寸,它只会显示滚动条。因此 SetSizerAndFit 调用试图使 window 足够大以容纳没有最小尺寸的 window,结果是 window 只有标题栏、菜单, 和状态栏。

或者,如果您的主框架只有 1 个 child 类型的视图,您可以完全跳过 sizer。 wxFrame objects 只有 1 child 并且没有 sizer 自动调整 1 child 的大小以填充框架的客户区域。