首页 > 解决方案 > 为什么我的窗口被 wxBoxSizer 调整为小于其最小尺寸

问题描述

我创建了我的应用程序的主窗口

Main::Main() : wxFrame(nullptr, wxID_ANY, "Test", wxPoint(64, 64), wxSize(1024, 768))

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

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

视图通过 main 的构造函数添加到 mainm_view = new View(this);

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

在此处输入图像描述

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

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

我最终得到了这个:

在此处输入图像描述

我曾希望我的视图会扩大并适合主窗口,但这并没有发生。我究竟做错了什么?

我正在使用 wxWidgets 的 3.14 版。

标签: c++wxwidgets

解决方案


只需调用SetSizer而不是SetSizerAndFit. 的文档SetSizerAndFit这样说的:

此方法调用 SetSizer() 和 wxSizer::SetSizeHints() ,它将初始窗口大小设置为容纳所有 sizer 元素所需的大小,并将最小大小设置为相同大小

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

或者,如果您的主框架只有 1 个 View 类型的子框架,您可以完全跳过 sizer。wxFrame 对象只有 1 个子对象且没有 sizer 会自动调整该 1 个子对象的大小以填充框架的客户区。


推荐阅读