C++ 替换wxWidgets中wxFrame的大小调整器

C++ 替换wxWidgets中wxFrame的大小调整器,c++,c++11,wxwidgets,C++,C++11,Wxwidgets,我正在编写一个小型扫雷游戏,只是为了熟悉wxWidgets(Windows,wxWidgets 3.1.4)。该应用程序可以很好地处理一个游戏,现在我想添加“新游戏”功能。对于布局,我使用了wxGridSizer 我的第一种方法是创建一个新的wxGridSizer,其中包含新字段,然后用新字段替换当前的sizer。尽管我知道了如何重用旧的sizer(一般来说,它可能也是一个更好的解决方案),但我还是有点好奇如何正确地更换sizer 我能够将我的问题简化为: #包括 #ifndef WX_预压缩

我正在编写一个小型扫雷游戏,只是为了熟悉wxWidgets(Windows,wxWidgets 3.1.4)。该应用程序可以很好地处理一个游戏,现在我想添加“新游戏”功能。对于布局,我使用了
wxGridSizer

我的第一种方法是创建一个新的
wxGridSizer
,其中包含新字段,然后用新字段替换当前的sizer。尽管我知道了如何重用旧的sizer(一般来说,它可能也是一个更好的解决方案),但我还是有点好奇如何正确地更换sizer

我能够将我的问题简化为:


#包括
#ifndef WX_预压缩
#包括
#恩迪夫
MyApp类:公共wxApp{
公众:
虚拟bool-OnInit();
};
类MyFrame:publicwxframe{
公众:
MyFrame(常量wxString和title、常量wxPoint和pos、常量wxSize和size);
私人:
无效OnExit(wxCommandEvent&event);
充装无效(wxCommandEvent&event);
wxDECLARE_事件_表();
};
枚举{ID_Refill=1};
wxBEGIN_事件_表(MyFrame,wxFrame)
EVT_菜单(ID_重新填充,MyFrame::OnRefill)
EVT_菜单(wxID_退出,MyFrame::OnExit)
wxEND_EVENT_TABLE()wxIMPLEMENT_APP(MyApp);
bool MyApp::OnInit(){
MyFrame*frame=newmyframe(“你好,世界”,wxPoint(50,50),wxSize(300200));
帧->显示(真);
返回true;
}
MyFrame::MyFrame(常量wxString和title、常量wxPoint和pos、常量wxSize和size)
:wxFrame(空、wxID_任意、标题、位置、大小){
wxMenu*菜单=新的wxMenu;
菜单->追加(ID_重新填充,“&Refill…\tCtrl-R”,“创建新布局”);
wxMenuBar*菜单栏=新的wxMenuBar;
菜单栏->附加(菜单“&menu”);
设置菜单栏(菜单栏);
wxGridSizer*sizer=新的wxGridSizer(2,2,1,1);
固定器(施胶器);
用于(自动i=0;i<4;i++){
wxButton*button=新的wxButton(this,wxID_ANY,std::to_string(i),wxDefaultPosition,wxDefaultSize,0);
sizer->Add(按钮,wxALL,0);
}
}
void MyFrame::OnExit(wxCommandEvent&){
接近(真);
}
void MyFrame::OnRefill(wxCommandEvent&){
冻结();
GetSizer()->清除(true);
wxGridSizer*sizer=新的wxGridSizer(3,3,1,1);
固定器(施胶器);
用于(自动i=0;i<9;i++){
wxButton*button=新的wxButton(这个,wxID_ANY,std::string(“重新填充”)+std::to_string(i),wxDefaultPosition,
wxDefaultSize,0);
sizer->Add(按钮,wxALL,0);
}
sizer->Layout();
解冻();
刷新();
}
问题是在执行
onrefille
功能后,应用程序仅显示第一个按钮(
Refilled0
),而不显示其余按钮

重新加注时在
之前

重新加注时
之后


我的问题是如何正确地替换
MyFrame
的大小码器?根据我从示例和文档中了解到的情况,这应该是可行的,但我想我遗漏了一些东西。

要替换sizer,只需对
MyFrame::OnRefill
方法进行一个小的更改

而不是调用
sizer->Layout()只需调用
Layout()。我不完全清楚为什么调用sizer的布局不起作用

完整方法如下所示:

void MyFrame::OnRefill(wxCommandEvent &) {
  Freeze();
  GetSizer()->Clear(true);
  wxGridSizer *sizer = new wxGridSizer(3, 3, 1, 1);
  SetSizer(sizer);
  for (auto i = 0; i < 9; i++) {
    wxButton *button = new wxButton(this, wxID_ANY, std::string("Refilled") + std::to_string(i), wxDefaultPosition,
                                    wxDefaultSize, 0);
    sizer->Add(button, wxALL, 0);
  }
  Layout();
  Thaw();
  Refresh();
}
void MyFrame::OnRefill(wxCommandEvent&){
冻结();
GetSizer()->清除(true);
wxGridSizer*sizer=新的wxGridSizer(3,3,1,1);
固定器(施胶器);
用于(自动i=0;i<9;i++){
wxButton*button=新的wxButton(这个,wxID_ANY,std::string(“重新填充”)+std::to_string(i),wxDefaultPosition,
wxDefaultSize,0);
sizer->Add(按钮,wxALL,0);
}
布局();
解冻();
刷新();
}

为什么要更换任何东西?布局是一样的,对吗?在同一位置有相同的按钮网格。您只需更改显示的图标即可。对吗?字段的大小也可以更改。我可以通过重新使用施胶器来解决我原来的问题,但我想知道如何正确地更换施胶器。我对此很感兴趣,因为我看不出我粘贴的代码不起作用的任何原因,因此找出问题会教我一些东西(我认为这是学习过程中需要的)。