wxWidgets C++开发时wxButton铺满主窗口客户区问题求助
问题原因
wxFrame 存在默认布局逻辑:当它仅有一个直接子控件时,会自动将该子控件拉伸铺满整个客户区,忽略手动指定的坐标和尺寸参数,属于框架内置的默认行为。
解决方案
最通用的修复方式是新增 wxPanel 作为主窗口的中间容器,所有控件都放在这个panel上,修改后的mainFrame.cpp构造函数代码如下:
mainFrame::mainFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(nullptr, wxID_ANY, title, pos, size) { // 新增panel作为主容器 wxPanel* mainPanel = new wxPanel(this, wxID_ANY); // 按钮的父对象改为panel hewwo = new wxButton(mainPanel, ID_BTN, "Hewwo World", wxPoint(15, 15), wxSize(70, 20)); // 后续菜单相关代码保持不变 sett = new wxMenu(); sett->AppendSeparator(); sett->Append(ID_SETT, "&Settings"); quitApp = new wxMenu(); quitApp->AppendSeparator(); quitApp->Append(wxID_EXIT, "&Quit this crap"); abt = new wxMenu(); abt->AppendSeparator(); abt->Append(wxID_ABOUT, "&About"); mbar = new wxMenuBar(); mbar->Append(sett, "&Settings"); mbar->Append(abt, "&About"); mbar->Append(quitApp, "&Quit"); SetMenuBar(mbar); }
可选方案
如果不想引入额外的panel容器,也可以直接关闭wxFrame的自动布局特性,在构造函数开头加一行代码即可:
SetAutoLayout(false);
更推荐使用panel的方案,wxPanel原生支持控件焦点切换、背景样式统一适配等特性,符合wxWidgets的开发规范。
内容的提问来源于stack exchange,提问作者Someone
相关产品推荐
相关产品推荐

