Как показать еще один кадр после события? - PullRequest
0 голосов
/ 02 апреля 2020

как показать другой кадр после события нажатия кнопки? вот так

Мой код здесь показывает окно OnInit. но что делать дальше? Я не нашел, как это сделать. мало опыта с этим. Я комментирую окно, которое должно быть.

enum
{
    wxID_First_Load = 5000,
    wxID_First_Frame,
    wxID_First_Panel
};

class MyFrame : public wxFrame
{
public:
    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
    void fileLoad(wxCommandEvent& event);
private:
    int file_count = 0;
    wxDECLARE_EVENT_TABLE();
};

wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_BUTTON(wxID_First_Load, MyFrame::fileLoad)
wxEND_EVENT_TABLE()

wxIMPLEMENT_APP(MyApp);

bool MyApp::OnInit()
{
    MyFrame *frame = new MyFrame("Hello World", wxDefaultPosition, wxSize(450, 250));
    frame->SetWindowStyle(wxCAPTION | wxSYSTEM_MENU );
    frame->Show(true);
    return true;
}

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
    : wxFrame(NULL, wxID_First_Frame, title, pos, size)
{
        wxBoxSizer *first_sizer = new wxBoxSizer(wxVERTICAL);
        wxPanel *firstPanel = new wxPanel(this, wxID_First_Panel);
        wxButton *firstButton_Load = new wxButton(firstPanel, wxID_First_Load, "Choose file");

        firstPanel->SetSizer(first_sizer); 
        first_sizer->Add(firstButton_Load, 1, wxEXPAND | wxALL, 10);
        firstPanel->SetSizer(first_sizer);
}

void MyFrame::fileLoad(wxCommandEvent& WXUNUSED(event))
{
    file_count = 2;
}

Второй кадр или окно:

wxPanel *firstPanel = new wxPanel(this, wxID_First_Panel);
wxBoxSizer *second_sizer = new wxBoxSizer(wxVERTICAL);
for (int i = 0; i < file_count; i++)
{
second_sizer->Add(new wxTextCtrl(firstPanel, wxWindowID(i), "Hello", wxDefaultPosition, wxSize(235, 60)), wxSizerFlags(0).Border(wxALL, 5));
}
firstPanel->SetSizer(second_sizer);

1 Ответ

0 голосов
/ 02 апреля 2020

Чтобы создать новый фрейм, вам нужно создать новый объект класса wxFrame или класс, производный от него. Как правило, вы хотите поместить некоторые данные и логи c в ваш новый фрейм, поэтому вы должны создать некоторый класс, например MySecondaryFrame (но, надеюсь, с лучшим именем), наследующий от wxFrame аналогично существующему MyFrame class.

Затем, чтобы показать это, вы должны сделать то же самое, что вы делаете в MyApp::OnInit(), то есть создать новый объект этого класса и вызвать Show(), чтобы фактически показать его.

PS Обратите внимание, что ваш вызов SetWindowStyle(wxCAPTION | wxSYSTEM_MENU ) не нужен, эти стили уже включены по умолчанию. Кроме того, жесткое кодирование размера кадра в пикселях - плохая идея, рассмотрите возможность использования размеров для определения наилучшего размера, подходящего для содержимого кадра, или просто оставьте его неуказанным, если это действительно не имеет значения.

...