c++ - 为什么我的窗口被 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 版。
解决方案
只需调用SetSizer
而不是SetSizerAndFit
. 的文档是SetSizerAndFit
这样说的:
此方法调用 SetSizer() 和 wxSizer::SetSizeHints() ,它将初始窗口大小设置为容纳所有 sizer 元素所需的大小,并将最小大小设置为相同大小
然而,滚动窗口通常不会有最小尺寸,因为如果它的当前尺寸低于给定尺寸,它只会显示滚动条。所以SetSizerAndFit
调用试图使窗口足够大以容纳一个没有最小尺寸的窗口,结果是一个只有标题栏、菜单和状态栏的窗口。
或者,如果您的主框架只有 1 个 View 类型的子框架,您可以完全跳过 sizer。wxFrame 对象只有 1 个子对象且没有 sizer 会自动调整该 1 个子对象的大小以填充框架的客户区。
推荐阅读
- flutter - 在颤动中从小部件捕获视频
- docker - 通过 HTTP 启动 docker 守护进程
- php - phpinfo() 显示 opcache.blacklist_filename 文件,但内容被忽略
- r - 此页面上表格的 html 节点?
- ruby-on-rails - 访问 azure AD 时出现 Rails 6 CORS 问题
- css - tailwind css 配置文件背景图片问题
- r - 计算宽格式数据表行的权重
- html - 我怎么把这个变小
- python - 使用不解析日期的 Python Pandas 读取电子表格
- javascript - 我想为 node api 编写一个自定义错误处理