Откройте 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 ответ
ctor не должен вызываться напрямую в C++. Используйте оператор
new
вместо.Проверьте подпись вашего
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();
,