Откройте wxDialog через Event и добавьте к нему панель

Я пытаюсь (начиная с 4 дней) открыть wxDialog (объявленный в своем собственном классе) через ClickOnEvent по пункту меню.

Мне удалось получить пустой wxDialog и открыть его немодально, чтобы я мог одновременно использовать MainFrame.

Но когда я пытаюсь добавить панель в wxDialog, но получаю ошибку:

ошибка: невозможно вызвать конструктор 'SideFrame::SideFrame' напрямую [-fpermissive]

void MainFrame::f_SF2(wxCommandEvent& event)
{
  SideFrame::SideFrame("SF2")
       : wxDialog(NULL, -1, title, wxDefaultPosition, wxSize(250, 230))
  {
    sf_p = new wxPanel(this, -1);

    wxColour col1;
    col1.Set(_T("#000000"));

    sf_p->SetBackgroundColour(col1);

    sf2->Show();
  }
}

Когда я пытаюсь сделать это, как показано ниже, я получаю другую ошибку:

неопределенная ссылка на `SideFrame::SideFrame(wxString const&)'

void MainFrame::f_SF2(wxCommandEvent& event)
{
SideFrame *sf2 = new SideFrame(_T("SF2"));


  wxPanel *sf_p = new wxPanel(sf2);

  wxColour col1;
  col1.Set(_T("#000000"));

  sf_p->SetBackgroundColour(col1);

  sf2->Show();
}

Может ли кто-нибудь мне помочь и сказать, как мне это сделать? Я использую wxWidgets 2.9.4 и g++- компилятор

1 ответ

  1. ctor не должен вызываться напрямую в C++. Используйте оператор new вместо.

  2. Проверьте подпись вашего SideFrame::SideFrame,

Ниже приведен пример, который может помочь.

#include <wx/wx.h>

class SideFrame : public wxDialog
{
public:
    SideFrame(wxString sTitle) : wxDialog(NULL, wxID_ANY, sTitle) {}
protected:
    void OnClose(wxCloseEvent &) {
        this->Destroy(); // Ask wxWidgets to `delete this;`
    }
private:
wxDECLARE_EVENT_TABLE();
};
wxBEGIN_EVENT_TABLE(SideFrame, wxDialog)
    EVT_CLOSE(SideFrame::OnClose)
wxEND_EVENT_TABLE()

class CApp : public wxApp
{
public:
    bool OnInit() {
        wxFrame * frame = new wxFrame(NULL, wxID_ANY, "demo");
        // Double click the main frame to create a modeless dialog.
        frame->Bind(wxEVT_LEFT_DCLICK, [](wxMouseEvent &)->void{
            // Create and display a modeless dialog.
            SideFrame * sf2 = new SideFrame("untitled"); // Note, a modeless dialog MUST be dynamically-allocated.
            (new wxPanel(sf2))->SetBackgroundColour(wxColour("#000000"));
            sf2->Show(true);
        });
        frame->Show(true);
        return this->wxApp::OnInit();
    }
};
DECLARE_APP(CApp)
IMPLEMENT_APP(CApp)

Обратите внимание, как немодальное диалоговое окно должно быть создано и удалено. Обычно мы создаем его как обычный динамический объект, а затем освобождаем его подходящим способом обработки, где this->Destroy();,

Другие вопросы по тегам