wxwidgeds: (Windows) Fenster wird erst nach Größenänderung angezeigt!
-
Hallo,
ich habe folgendes Problem: Mein Fenster von wxWidgets wird unter Windows erst nach einer Größenänderung durch die Maus vollständig angezeigt!
Der gleiche Code unter Linux kompiliert funktioniert einwandfrei! Weiss jemand Rat?
-
Hm, also ohne Code wird das schwer
-
Klar, kein Problem! Ich hatte nur erst gehofft dass das ein allgemein bekanntes Problem wäre...
Hier der Code:
/* asmanager.h */ #ifndef _ASMANAGER_H_ #define _ASMANAGER_H_ class asmanagerapp : public wxApp { public: virtual bool OnInit(); }; class asmanagerFrame : public wxFrame { public: asmanagerFrame( const wxString& title, const wxPoint& pos, const wxSize& pos ); void OnMinimize( wxCommandEvent& event ); void OnQuit( wxCommandEvent& event ); void OnUserAdd( wxCommandEvent& event ); void OnUserLoad( wxCommandEvent& event ); void OnAbout( wxCommandEvent& event ); void OnHelp( wxCommandEvent& event ); void OnCreateUser( wxCommandEvent& event ); private: DECLARE_EVENT_TABLE() //wxWindow test //wxPanel* m_panel; wxPanel* main_panel; //wxTextCtrl* textctrl; }; enum { Menu_Program_Minimize = 100, Menu_Program_Quit, Menu_Help_About = 200, Menu_Help_Help, Menu_User_Add = 300, Menu_User_Load, ID_Text_Username = 410, ID_Button_Username, ID_Tool_Bar }; #endif // _ASMANAGER_H_ /* Ende asmanager.h */
/* asmanager.cpp */ #include <wx/wx.h> #include "asmanager.h" BEGIN_EVENT_TABLE( asmanagerFrame, wxFrame ) EVT_MENU( Menu_Program_Minimize, asmanagerFrame::OnMinimize ) EVT_MENU( Menu_Program_Quit, asmanagerFrame::OnQuit ) EVT_MENU( Menu_User_Add, asmanagerFrame::OnUserAdd ) EVT_MENU( Menu_User_Load, asmanagerFrame::OnUserLoad ) EVT_MENU( Menu_Help_About, asmanagerFrame::OnAbout ) EVT_MENU( Menu_Help_Help, asmanagerFrame::OnHelp ) EVT_BUTTON( ID_Button_Username, asmanagerFrame::OnCreateUser ) EVT_TEXT_ENTER( ID_Text_Username, asmanagerFrame::OnCreateUser ) END_EVENT_TABLE() IMPLEMENT_APP(asmanagerapp) bool asmanagerapp::OnInit() { asmanagerFrame *frame = new asmanagerFrame( wxT( "AS Manager v0.1.0" ), wxPoint(50,50), wxSize(800,600) ); frame->Show(TRUE); SetTopWindow(frame); return TRUE; } asmanagerFrame::asmanagerFrame( const wxString& title, const wxPoint& pos, const wxSize& size ) : wxFrame((wxFrame *)NULL, -1, title, pos, wxDefaultSize, /*wxSIMPLE_BORDER | wxMAXIMIZE*/ wxDEFAULT_FRAME_STYLE ) { wxMenuBar *menuBar = new wxMenuBar; wxMenu *menuProgram = new wxMenu; menuProgram->Append( Menu_Program_Minimize, wxT( "&Minimieren" ) ); menuProgram->AppendSeparator(); menuProgram->Append( Menu_Program_Quit, wxT( "B&eenden" ) ); menuBar->Append( menuProgram, wxT( "&Programm" ) ); wxMenu *menuUser = new wxMenu; menuUser->Append( Menu_User_Add, wxT( "Benutzerprofil &erstellen" ) ); menuUser->Append( Menu_User_Load, wxT( "Profil &laden" ) ); menuBar->Append( menuUser, wxT( "&Benutzer") ); wxMenu *menuHelp = new wxMenu; menuHelp->Append( Menu_Help_About, wxT( "&Info..." ) ); menuHelp->AppendSeparator(); menuHelp->Append( Menu_Help_Help, wxT( "&Hilfe" ) ); menuBar->Append( menuHelp, wxT( "&Hilfe" ) ); SetMenuBar( menuBar ); // ToolBar wxToolBar* toolBar = new wxToolBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_HORIZONTAL | wxNO_BORDER | wxTB_FLAT); wxBitmap bmp_minimize( wxT("Icons/minimize.bmp"), wxBITMAP_TYPE_BMP ); wxBitmap bmp_exit( wxT("Icons/exit.bmp"), wxBITMAP_TYPE_BMP ); wxBitmap bmp_add_user( wxT("Icons/add_user.bmp") , wxBITMAP_TYPE_BMP ); wxBitmap bmp_load_user( wxT("Icons/search_user.bmp"), wxBITMAP_TYPE_BMP ); toolBar->AddTool( Menu_User_Add, bmp_add_user, wxT("Benutzer erstellen") ); toolBar->AddTool( Menu_User_Load, bmp_load_user, wxT("Profil laden") ); toolBar->AddSeparator(); toolBar->AddTool( Menu_Program_Minimize, bmp_minimize, wxT("Minimieren") ); toolBar->AddTool( Menu_Program_Quit, bmp_exit, wxT("Beenden") ); toolBar->Realize(); SetToolBar(toolBar); //SetMenuBar(menuBar); CreateStatusBar(); SetStatusText( wxT( "AS Manager v0.1.0" ) ); //Maximize(); // ShowFullScreen(true); } void asmanagerFrame::OnMinimize( wxCommandEvent& WXUNUSED( event ) ) { Iconize(true); } void asmanagerFrame::OnQuit( wxCommandEvent& WXUNUSED( event ) ) { Close(TRUE); } void asmanagerFrame::OnUserAdd( wxCommandEvent& WXUNUSED( event ) ) { ; delete main_panel; main_panel = new wxPanel(this); (void) new wxStaticText( main_panel, -1, wxT("Bitte neuen Benutzernamen eingeben:"), wxPoint(350,250) ); wxTextCtrl* username = new wxTextCtrl( main_panel, ID_Text_Username, wxT(""), wxPoint(350, 270), wxSize(250, 20), wxTE_PROCESS_ENTER | wxTE_NO_VSCROLL); (void) new wxButton( main_panel, ID_Button_Username, wxT("Benutzer erstellen"), wxPoint(350, 295), wxSize(250, 25) ); SetStatusText( wxT("Benutzername eingeben!") ); textctrl = username; main_panel->Show(true); } void asmanagerFrame::OnUserLoad( wxCommandEvent& WXUNUSED( event ) ) { ; delete main_panel; main_panel = new wxPanel(this); (void) new wxStaticText( main_panel, -1, wxT("a"), wxPoint(200,200) ); main_panel->Show(true); } void asmanagerFrame::OnAbout( wxCommandEvent& WXUNUSED( event ) ) { wxMessageBox( wxT( "AS Manager v0.1.0 \n(c) 2007 Florian Penn" ), wxT( "AS Manager Info" ), wxOK | wxICON_INFORMATION, this ); } void asmanagerFrame::OnHelp( wxCommandEvent& WXUNUSED( event ) ) { ; } void asmanagerFrame::OnCreateUser( wxCommandEvent& WXUNUSED( event ) ) { wxTextCtrl *username = (wxTextCtrl*) FindWindowById(ID_Text_Username); wxString text = wxT( "Benutzer " ); text += username->GetValue(); text += wxT( " erfolgreich erstellt!" ); delete main_panel; main_panel = new wxPanel(this); SetStatusText( text ); //SetStatusText( wxT("Benutzer erfolgreich erstellt!" ) + username->GetLineText(1) ); } /* Ende asmanager.cpp */
Unter Windows hab ich das ganze mit wxDev-C++ v6.10.2 kompiliert!
Unter Linux mit KDevelop geht alles bestens!
-
Hm, ka. Würde mich aber mal interessieren wieso du da delete so missbrauchst.
Gibt bessere Lösungen als das Fenster zu löschen und neu zu erstellen. Ausserdem kann ich nicht sehen, wo du das Fenster initial erzeugst.Ach und unter Windows solltest du was besseres als wxDev Cpp nutzen (C::B oder MSVC Express z.B.).
-
phlox81 schrieb:
Gibt bessere Lösungen als das Fenster zu löschen und neu zu erstellen. Ausserdem kann ich nicht sehen, wo du das Fenster initial erzeugst.
Ach und unter Windows solltest du was besseres als wxDev Cpp nutzen (C::B oder MSVC Express z.B.).
Also ich hab grad erst angefangen mit wx und deshalb war delete die einzige Möglichkeit die mir eingefallen ist das Fenster zu löschen! So wirklich gefallen tuts mir auch nicht, bin auch für jeden besseren Vorschlag dankbar!
Das Fenster wird glaub ich bei OnInit() erzeugt, hab das aber aus der Vorlage von KDevelop übernommen!
wxDev nehm ich weils problemlos unter Linux läuft (mit wine)! Hab zwar noch eine kleine XP Partition, aber da will ich nicht unbedingt SP2 rauftun für MSVC! Bei Windows bleib ich bei dem Motto "Never change a running system!"
Kann evtl. mal jemand versuchen den Code zu kompilieren und auszuführen mit einer anderen IDE? Oder kennt noch jemand ne Umgebung die mit wine unter Linux läuft?
-
Fenster solltest du in wxWidgets generell mit ->Destroy löschen, und nicht mit einem delete.
Verschiedene Ansichten kannst du realisieren, in dem du dafür jeweils eine Klasse von wxPanel ableitest, oder entsprechend die Steuerelemente
in einem Sizer an und ausschaltest. (über Panelklassen ist es aber einfacher).
-
Danke schon mal für die Tipps, die helfen sicher weiter!
Aber wie kann ich denn überprüfen ob main_panel schon mit new erstellt wurde?
Wenn ichmain_panel->Destroy()
aufrufe bevor ich es erstellt habe, bricht er mit Segmentation fault ab. Bei delete gibts kein Problem!
Oder sollte ich generell gleichmain_panel = new wxPanel(this)
machen, damit es nicht vorkommen kann, dass es noch nicht zugewiesen wurde?
Und weiss schon mal jemand Rat wegen dem Problem mit dem Anzeigen beim Fensterverschieben?
-
Entweder du erzeugst ein initiales Fenster im Konstruktor, oder du setzt den Zeiger dort auf NULL.
Dann kannst du mit if(main_panel != NULL) abprüfen, ob du destroy aufrufen musst. Aber generell würde ich dir empfehlen, für jede Ansicht ein eigenes Panel von wxPanel abzuleiten, und nur die Panels auszutauschen.Und lies dir evtl. mal die Artikel zu wxWidgets im C++ Magazin durch!