wxMDIChildFrame - CloseEvent
-
Hi,
es geht um wxWidgets 3.0
Ich habe in einer Frame, abgeleitet von wxMDIChildFrame das Problem, dass kein Close-Event aufgerufen wird.
Ich habe noch nicht so viel Erfahrung mit wxWidgets, woran kann das liegen?
class Frames::ChildFrame : public wxMDIChildFrame { public: ChildFrame (wxMDIParentFrame*); protected: wxPanel* ControlPanel; void OnClose(wxCloseEvent &event); void OnSize(wxSizeEvent& event); DECLARE_EVENT_TABLE() }; [...] BEGIN_EVENT_TABLE(Frames::ChildFrame , wxMDIChildFrame) EVT_SIZE(Frames::ChildFrame::OnSize) EVT_CLOSE(Frames::ChildFrame::OnClose) END_EVENT_TABLE() [...] void Frames::ChildFrame::OnSize(wxSizeEvent& event) { event.Skip(); } void Frames::ChildFrame::OnClose(wxCloseEvent &event) { event.Skip(); }
Muss ich im OnClose() vom wxMDIParentFrame für jeden Child einzeln den Destruktor aufrufen?
Gruß
-
Childs werden vom Parent gehandhabt. Da musst du keine Destruktoren aufrufen.
Was ist denn hier das Ziel? Ohne Kontext ist es schwer zu helfen.
Willst du das schliessen verhindern?
-
Hi,
ich habe ein wxPanel, in dem ich DirectX rendere.
Wenn das Panel geschlossen wird, soll natürlich auch das DX releaset werden.Aber bei mir wird die OnClose Methode irgendwie nich aufgerufen.
Gruß
-
Kann mir niemand weiterhelfen?
-
Du weisst, dass das event.Skip() das event weiterleitet?
Jeglicher Code danach könnte nicht ausgeführt werden.
Davon abgesehen sollte es funktionieren.
Habe eben diesen minimalen Code geschrieben:class Application : public wxApp { public: virtual ~Application(); virtual bool OnInit(); }; Application::~Application() {} bool Application::OnInit() { wxMDIParentFrame* f = new wxMDIParentFrame(nullptr, wxID_ANY, "Parent"); f->SetMenuBar(new wxMenuBar()); new MDIChild(f); new MDIChild(f); f->Show(); SetTopWindow(f); return true; } IMPLEMENT_APP(Application); class MDIChild : public wxMDIChildFrame { public: MDIChild(wxMDIParentFrame* parent); virtual ~MDIChild(); void OnClose(wxCloseEvent&); private: DECLARE_EVENT_TABLE(); }; BEGIN_EVENT_TABLE(MDIChild, wxMDIChildFrame) EVT_CLOSE(MDIChild::OnClose) END_EVENT_TABLE() MDIChild::MDIChild(wxMDIParentFrame* parent) : wxMDIChildFrame(parent, wxID_ANY, "Child") {} MDIChild::~MDIChild() {} void MDIChild::OnClose(wxCloseEvent& e) { wxMessageBox("Close", "Test"); }
Funktionierte einwandfrei bei mir.
Ohne mehr code oder was genau bei dir passiert, kann ich dir nicht helfen leider. Was sagt denn der Debugger? Mal einen breakpoint auf das close event gesetzt? Oder eine MessageBox?
-
Hi,
hier mal mein Code - minimiert:
class Frames::Child : public wxMDIChildFrame { public: Child(MDIParentFrame*); virtual ~Child(); void OnClose(wxCloseEvent&); void OnSize(wxSizeEvent& event); private: Widgets::DXPanel* DXPanel; wxPanel* ControlPanel; DECLARE_EVENT_TABLE(); }; [...] BEGIN_EVENT_TABLE(Frames::Child, wxMDIChildFrame) EVT_SIZE(Frames::Child::OnSize) EVT_CLOSE(Frames::Child::OnClose) END_EVENT_TABLE() Frames::Child::Child(MDIParentFrame* parent) : wxMDIChildFrame((wxMDIParentFrame*)parent,wxID_ANY,"Tile Editor") { this->DXPanel = new Widgets::DXPanel(this,wxDefaultPosition,wxDefaultSize); this->DXPanel->InitDX(); this->DXPanel->Show(true); this->ControlPanel = new wxPanel(this,wxID_ANY,wxDefaultPosition,wxSize(300,500)); this->ControlPanel->SetMinSize(wxSize(300,500)); this->ControlPanel->Show(true); wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(this->DXPanel,1,wxEXPAND); sizer->Add(this->ControlPanel,0,wxEXPAND); this->SetSizer(sizer); this->SetMinSize(wxSize(600,500)); this->SetSize(wxSize(600,500)); this->Maximize(true); } Frames::Child::~Child() { } void Frames::Child::OnSize(wxSizeEvent& event) { event.Skip(); } void Frames::Child::OnClose(wxCloseEvent &event) { wxMessageBox("1232","123"); event.Skip(); }
Das OnSize funktioniert, das OnClose nicht...
Kann mir jemand weiterhelfen?
P.S: Die OnClose der ParentFrame wird ausgeführt...
Gruß
-
Hi,
anscheinend wird die OnClose Methode nur aufgerufen, wenn ich das Frame schließe, und nicht, wenn ich das Programm beende.
Gibt es da noch einen anderen Event, der beim Zerstören des Frames aufgerufen wird? Weil die OnClose Methode vom DXPanel ja auchnicht aufgerufen wird, und das DirectX-Zeug nicht released wird.
Gruß