You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

wxWidgets中点击File->New菜单为wxAuiNotebook添加新页面的方法问询

解决步骤

  1. 将wxAuiNotebook声明为MyFrame的成员变量
    你当前代码中的wxAuiNotebook* notebook是构造函数内的局部变量,退出构造函数后无法在其他成员函数(比如OnMenuNew)中访问,所以首先要修改MyFrame的类定义(通常在main.h文件中),添加对应的成员变量:
class MyFrame : public wxFrame
{
public:
    MyFrame();
    ~MyFrame();
    // 其余已有函数声明保留
private:
    wxAuiNotebook* m_notebook; // 新增notebook成员变量
    // 其余已有私有成员保留
};
  1. 修改构造函数内的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();
}
  1. 实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 02:48:01