wxCloseEvent wird nicht aufgefangen



  • Hallo zusammen

    Weiss jemand wieso die Close-Events nicht gefangen werden? Die müssten ja von den Frames zur App-Klasse weitergereicht werden. Wenn ich ausserdem das Paint-Event connecte (zeile 63) blockiert das Logfenster wenn ich ein Menu-Item anwähle. Was ist hier faul? Danke!

    P.S.
    Ok, ich habe jetzt gelesen dass nur Command-Events propagieren. Die Aufhänger sind aber trotzdem seltsam.

    class LogWindow: public wxFrame
    {
        public:
            LogWindow(wxWindow* parent, int id): wxFrame(parent, id, _T("Log"), wxPoint(0, 0))
            {
                m_log = new wxTextCtrl(this, -1, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY);
                CreateStatusBar();
    
                wxMenuBar* mb = new wxMenuBar;
    
                wxMenu* fileMenu = new wxMenu;
                fileMenu->Append(0, _T("Save To File...\tCtrl-S"));
    
                wxMenu* editMenu = new wxMenu;
                editMenu->Append(1, _T("Clear"));
    
                mb->Append(fileMenu, _T("&File"));
                mb->Append(editMenu, _T("&Edit"));
    
                SetMenuBar(mb);
    
                Connect(wxEVT_COMMAND_MENU_SELECTED, wxMenuEventHandler(LogWindow::OnMenu));
            }
    
            void OnMenu(wxMenuEvent& evt)
            {
                wxMessageBox(wxString::Format(_T("%d"), evt.GetId()));
            }
    
            template<class T>
            LogWindow& operator << (const T& val)
            {
                (*m_log) << val;
    
                return *this;
            }
        private:
            wxTextCtrl* m_log;
    };
    
    class App: public wxApp
    {
        private:
            wxFrame* m_frame;
            LogWindow* m_log;
    
            enum
            {
                FRAME_ID,
                LOG_ID
            };
    
        public:
            App()
            {
            }
    
            bool OnInit()
            {
                m_frame = new wxFrame(0, FRAME_ID, _("wxWidgets Test"), wxDefaultPosition, wxSize(512, 384));
                m_log = new LogWindow(0, LOG_ID);
    
                //Connect(FRAME_ID, wxEVT_PAINT, wxPaintEventHandler(App::OnPaintFrame));
                Connect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(App::OnClose));
    
                m_frame->Show();
                m_log->Show();
    
                return true;
            }
    
            void OnPaintFrame(wxPaintEvent& evt)
            {
                wxPaintDC dc(m_frame);
            }
    
            void OnClose(wxCloseEvent& evt)
            {
                switch(evt.GetId())
                {
                    case FRAME_ID:
                        wxMessageBox(_T("Destroying Frame"));
                        m_frame->Destroy();
                        break;
    
                    case LOG_ID:
                        wxMessageBox(_T("Destroying Log"));
                        m_log->Destroy();
                        break;
    
                    default:
                        wxASSERT(0);
                        break;
                }
    
            }
    
        DECLARE_EVENT_TABLE()
    };
    
    BEGIN_EVENT_TABLE(App, wxApp)
    END_EVENT_TABLE()
    
    IMPLEMENT_APP(App)
    

Anmelden zum Antworten