wxWidgets中点击File->New菜单为wxAuiNotebook添加新页面的方法问询
解决步骤
- 将wxAuiNotebook声明为MyFrame的成员变量
你当前代码中的wxAuiNotebook* notebook是构造函数内的局部变量,退出构造函数后无法在其他成员函数(比如OnMenuNew)中访问,所以首先要修改MyFrame的类定义(通常在main.h文件中),添加对应的成员变量:
class MyFrame : public wxFrame { public: MyFrame(); ~MyFrame(); // 其余已有函数声明保留 private: wxAuiNotebook* m_notebook; // 新增notebook成员变量 // 其余已有私有成员保留 };
- 修改构造函数内的notebook初始化逻辑
把原来构造函数里局部定义notebook的代码,替换为给成员变量m_notebook赋值,原有添加初始页面的逻辑仅需要替换变量名即可:
MyFrame::MyFrame() : wxFrame(nullptr, wxID_ANY, "AUItest", wxPoint(50, 50), wxSize(800, 450), wxDEFAULT_FRAME_STYLE) { // 菜单初始化逻辑保持不变 wxMenuBar* menubar = new wxMenuBar; wxMenu* menufile = new wxMenu; menufile->Append(1001, "New"); menufile->Append(1002, "Open"); menufile->Append(1003, "Save"); menufile->Append(1004, "Exit"); menubar->Append(menufile, "File"); SetMenuBar(menubar); // 替换原局部notebook定义为成员变量赋值 m_notebook = new wxAuiNotebook(this, -1, wxPoint(-1, -1), wxSize(-1, -1), wxNB_TOP | wxAUI_NB_CLOSE_ON_ACTIVE_TAB); wxPanel* panel1 = new wxPanel(m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize); wxPanel* panel2 = new wxPanel(m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize); wxPanel* panel3 = new wxPanel(m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize); m_notebook->AddPage(panel1, wxT("Sheet1")); m_notebook->AddPage(panel2, wxT("Sheet2")); m_notebook->AddPage(panel3, wxT("Sheet3")); Center(); }
- 实现OnMenuNew的添加页面逻辑
在OnMenuNew函数中新建标签页的容器控件,调用AddPage方法添加到notebook即可,还可以配置自动选中新创建的标签页:
void MyFrame::OnMenuNew(wxCommandEvent& event) { // 1. 新建标签页容器,父窗口指定为m_notebook wxPanel* newPanel = new wxPanel(m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize); // 如果需要给页面添加自定义控件,可在这部分实现,示例如下: // wxTextCtrl* editArea = new wxTextCtrl(newPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE); // wxBoxSizer* panelSizer = new wxBoxSizer(wxVERTICAL); // panelSizer->Add(editArea, 1, wxEXPAND); // newPanel->SetSizer(panelSizer); // 2. 生成不重复的标签名 int totalPage = m_notebook->GetPageCount(); wxString newPageName = wxString::Format("Sheet%d", totalPage + 1); // 3. 添加到notebook,第三个参数为true表示添加后自动选中新页面 m_notebook->AddPage(newPanel, newPageName, true); }
如果你需要实现更复杂的页面逻辑,也可以单独定义继承自wxPanel的自定义页面类,在OnMenuNew中实例化该类后再添加到notebook即可,和你之前使用独立类实现wxAuiMDIChildFrame的逻辑完全一致。
内容的提问来源于stack exchange,提问作者jake
相关产品推荐
相关产品推荐

