(wx) Dynamisches Element, Speicherzugriffsverletzung



  • Hallo alle zusammen.

    Ich habe ein kleines Problem, und zwar habe ich mal aus langer weile zur Übung mal drauf los gecoded und bin jetzt an einer Stelle an der ich nicht weiterkomme. Mein Programm soll sich nach einem Tastendruck "in Luft auflösen" und ein Icon im System-Tray hinterlassen (funktioniert auch). Nach einem klick auf das Tray-Icon soll das Programm wieder in voller blüte erscheinen (Speicherzugriffsverletzung). Hier erst mal den kompletten Code (jaja ich weiß, schön unordentlich, ich trenne das nachher in verschiedene Dateien und räume bisschen auf 😉 )

    #include <wx/wx.h>
    #include <wx/notebook.h>
    #include <wx/taskbar.h>
    #include "logo.xpm"
    #include "icon.xpm"
    
    class MyApp: public wxApp
    {
        virtual bool OnInit();
    };
    
    class MyFrame: public wxFrame
    {
    public:
    
        MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
    	void OnMinimize(wxCommandEvent &event);
    	void OnIcon(wxTaskBarIconEvent &event);
    
        DECLARE_EVENT_TABLE()
    };
    
    enum
    {
    	ID_Minimize = 1,
    };
    
    BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    	EVT_BUTTON(ID_Minimize, MyFrame::OnMinimize)
    END_EVENT_TABLE()
    
    IMPLEMENT_APP(MyApp)
    
    bool MyApp::OnInit()
    {
        MyFrame *frame = new MyFrame( _("Supsidian"), wxDefaultPosition, wxDefaultSize );
    	frame->Show(true);											 
        SetTopWindow(frame);
        return true;
    } 
    
    MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
    : wxFrame( NULL, -1, title, pos, size, wxSTAY_ON_TOP | wxFRAME_NO_TASKBAR)
    {
    	this->ShowFullScreen(true);
    	this->SetIcon(icon_xpm);
    	wxTaskBarIcon *tbi = new wxTaskBarIcon;
    	tbi->SetIcon(icon_xpm);
    	tbi->Connect(wxEVT_TASKBAR_LEFT_DOWN, wxTaskBarIconEventHandler(MyFrame::OnIcon));
    
    	wxNotebook *notebook = new wxNotebook(this, -1, wxPoint(0,0), this->GetClientSize(), wxNB_BOTTOM | wxNB_FIXEDWIDTH);
    	wxNotebookPage *page0 = new wxNotebookPage(notebook, -1, wxPoint(0,0), notebook->GetClientSize());
    	wxNotebookPage *page1 = new wxNotebookPage(notebook, -1, wxPoint(0,0), notebook->GetClientSize());
    	wxNotebookPage *page2 = new wxNotebookPage(notebook, -1, wxPoint(0,0), notebook->GetClientSize());
    	wxNotebookPage *page3 = new wxNotebookPage(notebook, -1, wxPoint(0,0), notebook->GetClientSize());
    	wxNotebookPage *page4 = new wxNotebookPage(notebook, -1, wxPoint(0,0), notebook->GetClientSize());
    	wxNotebookPage *page5 = new wxNotebookPage(notebook, -1, wxPoint(0,0), notebook->GetClientSize());
    
    	wxStaticBitmap *logo = new wxStaticBitmap(page0, -1, wxBitmap(logo_xpm, wxBITMAP_TYPE_XPM), wxPoint((page0->GetClientSize().x-640)/2,12));
    	wxButton *minimizeButton = new wxButton(page0, ID_Minimize, "Supsidian minimieren", wxPoint(logo->GetPosition().x, 300), wxSize(logo->GetSize().x, 27));
    
    	notebook->InsertPage(0, page0, "Startseite");
    	notebook->InsertPage(1, page1, "Tagebuch");
    	notebook->InsertPage(2, page2, "Notizbuch");
    	notebook->InsertPage(3, page3, "Kontakte");
    	notebook->InsertPage(4, page4, "Kalender");
    	notebook->InsertPage(5, page5, "To-Do-Liste");
    }
    
    void MyFrame::OnMinimize(wxCommandEvent &event)
    {
    	this->Show(false);
    }
    
    void MyFrame::OnIcon(wxTaskBarIconEvent &event)
    {
    	this->ShowFullScreen(true);
    }
    

    Die Funktion selbst lässt sich aufrufen. Also wenn ich wxMessageBox() einfüge wird die auch ausgeführt. Aber das this->ShowFullScreen(true); verursacht eine Speicherzugriffsverletzung. Woran liegt das? Wo ist mein Fehler?
    Bin noch wxWidgets-Anfänger und wollte eig. dynamische Funktionszuweisung üben 😛

    mfg MatStorm



  • Ich habe jetzt ShowFullScreen() durch Show() ersetzt (OnIcon-Funktion) und habe die Connect-Funktion noch um die Parameter NULL und this erweitert, jetzt geht alles wie gewollt. Nur warum 😃
    Was habe cih da eigentlich genau gemacht?


Anmelden zum Antworten