[erledigt] wxWidgets und openGL, der Close-Icon geht nicht mehr richtig.



  • Hallo,

    ich habe gerade das folgende Tut studiert:
    http://wiki.wxwidgets.org/WxGLCanvas (wxGLCanvas sample)

    Und dieses Sample habe ich dann in mein Programm übernommen. Mein Problem ist es, dass ich, wenn ich das Close-Icons des Frames nutze, dann einfach nichts passiert. Die einzigen Events, die ich abfange sind

    BEGIN_EVENT_TABLE(BasicGLPane, wxGLCanvas)
    EVT_SIZE(BasicGLPane::resized)
    EVT_PAINT(BasicGLPane::render)
    END_EVENT_TABLE()
    

    Wenn ich versuche, bei meinem Frame, dass EVT_CLOSE abzufangen, dann hängt sich das Programm ne Zeit lang auf und dann erst kommt mein "Wirklich zu Dialog". Allerdings, wenn ich mit Close(TRUE) oder Destroy() versuche den Frame zuzumachen, dann passiert wieder nicht.

    Einzige Ausnahme, wenn ich erst Close drücke und dann auf minimieren gehe, dann beendet das Programm regulär.

    Ich teste auf Windows mit Microsoft Visual Studio 2009 Pro und wxWidgets 2.8.10.

    Mein Code: (ist gröstenteils wie im Tut, nur abgespeckt und auf mehr Klassen verlagert)

    // BasicGLPane.h
    #ifndef __BasicGLPane__
    #define __BasicGLPane__
    
    #include <wx/wx.h>
    #include <wx/glcanvas.h>
    
    class BasicGLPane :
    	public wxGLCanvas
    {
    public:
    	BasicGLPane(wxFrame* parent, int* args);
    
    	void resized(wxSizeEvent& evt);
    
    	void render(wxPaintEvent& evt);
    
    	DECLARE_EVENT_TABLE()
    };
    
    #endif // __BasicGLPane__
    
    // BasicGLPane.cpp
    #include <wx/wx.h>
    #include <wx/glcanvas.h>
    
    #include "BasicGLPane.h"
    
    BEGIN_EVENT_TABLE(BasicGLPane, wxGLCanvas)
    EVT_SIZE(BasicGLPane::resized)
    EVT_PAINT(BasicGLPane::render)
    END_EVENT_TABLE()
    
    BasicGLPane::BasicGLPane(wxFrame* parent, int* args)
    : wxGLCanvas(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, _T("GLCanvas"), args)
    {
    }
    
    void BasicGLPane::resized(wxSizeEvent& evt)
    {
    	wxGLCanvas::OnSize(evt);
    
    	Refresh();
    }
    
    void BasicGLPane::render(wxPaintEvent& evt)
    {
    	if (!IsShown()) return;
    
    	// Start
    	SetCurrent();
    
    	// Befehle
    	glClearColor(0.0, 0.0, 0.0, 0.0); 
    	glMatrixMode(GL_PROJECTION); 
    	glLoadIdentity(); 
    	glOrtho(0.0, 10.0, 0.0, 10.0, -1.0, 1.0); 
    	glClear( GL_COLOR_BUFFER_BIT); 
    	glColor3f(0.0, 1.0, 0.0); 
    	glBegin(GL_POLYGON); 
    	glVertex3f(2.0, 4.0, 0.0); 
    	glVertex3f(8.0, 4.0, 0.0); 
    	glVertex3f(8.0, 6.0, 0.0); 
    	glVertex3f(2.0, 6.0, 0.0); 
    	glEnd(); 
    	glFlush(); 
    
    	// Raus damit
    	SwapBuffers();
    }
    
    // wxWidgets-Einstiegspunkt
    bool programm::OnInit(void)
    {
    	MainFrame* frame = new MainFrame();
    
    	frame->Show();
    
    	SetTopWindow(frame);
    
    	return true;
    }
    
    // Mainframe
    MainFrame::MainFrame(void)
    : wxFrame( (wxFrame *)NULL, wxID_ANY, _T("GL-Testerei"), wxPoint(50,50), wxSize(400,200))
    {
    	wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
    	int args[] = {WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0};
    
    	BasicGLPane* glPane = new BasicGLPane(this, args);
    	sizer->Add(glPane, 1, wxEXPAND);
    
    	SetSizer(sizer);
    	SetAutoLayout(true);
    }
    

    Ich vermute Mal, die Header von Mainframe und der andere SchnickSchnack wird nicht gebraucht.

    Kennt jemand dieses Problem und wodurch wird dieses Problem erzeugt? Ich will gerade openGL-Testen und einfache Balkendiagramme (3D) zu erzeugen und hab jetzt erst mit dem Thema angefangen, daher bitte (auch wenns komisch klingt) mit mir reden wie mit einem Idioten, das ich OK.



  • Ich bin schon mal soweit, dass wenn ich EVT_PAINT() auskommentiere, dann zwar nichts mehr gezeichnet wird, dafür aber der Close-Button wieder geht.



  • Ich hab das Tutorial von wxWiki nun verworfen und das Sample "penguin" als Vorlage genommen. Nun gehts! Was der Unterschied ist? Ich hab keine Ahnung!
    Danke!


Anmelden zum Antworten