einfache Ampel zeichnen...
-
@Freak_Coder Danke!
Habe das Cast intest_data = atof(buf2);
geändert und es funktioniert jetzt soweit das test_data wirklich 1, 2 oder 3 ist!
Nur wird trotzdem nicht entsprechend neu gezeichnet
-
Hm, also mit wxApp::OnRun kenn ich mich jetzt nicht so aus,
aber evtl. versuchst du es mal mit einer Methode in deinem Frame.
Oder fügst dort einen Timer ein, dann brauchst du auch nicht die Endlosschleife.
-
Hallo,
ich habe jetzt mit Hilfe des Forums einen Timer implementiert der auch funktioniert
und periodsch eine Verbindung zum Server aufbaut und die test Stati holt.
mein Problem ist nun das ich danach ja ein Refresh machen müsste, was aber im Timer oder auch in der verbinden methode ja nicht möglich ist, da der Timer und die verbinden methode ja non-member funktionen sind und das frame objekt somit nicht bekannt ist...
Kann ich irgendwie im timer ein event auslösen, so dass das Frame neu gezeichnet wird oder wie kann ich das neu zeichen realisieren?Hier nochmal ein paar code auszüge:
//--------------------------------------------------------------------------- // // Name: AuslastungFrm.cpp // Author: Fub // Created: 23.10.2006 15:17:33 // Description: // //--------------------------------------------------------------------------- #include "AuslastungFrm.h" //Do not add custom headers //wxDev-C++ designer will remove them ////Header Include Start ////Header Include End //---------------------------------------------------------------------------- // AuslastungFrm //---------------------------------------------------------------------------- //Add Custom Events only in the appropriate block. //Code added in other places will be removed by wxDev-C++ ////Event Table Start BEGIN_EVENT_TABLE(AuslastungFrm,wxFrame) ////Manual Code Start EVT_PAINT (AuslastungFrm::OnPaint) ////Manual Code End EVT_CLOSE(AuslastungFrm::AuslastungFrmClose) END_EVENT_TABLE() ////Event Table End void CALLBACK OnTimer(UINT myTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2); UINT myTimerID; AuslastungFrm::AuslastungFrm(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style) : wxFrame(parent, id, title, position, size, style) { CreateGUIControls(); myTimerID=timeSetEvent((UINT)10000, (UINT)10, OnTimer, (DWORD)0, TIME_PERIODIC); } AuslastungFrm::~AuslastungFrm() {} int data; double test_data; void OnTimer(UINT myTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2) { AuslastungFrm::verbinden(); } void AuslastungFrm::CreateGUIControls(void) { //Do not add custom code here //wxDev-C++ designer will remove them. //Add the custom code before or after the blocks ////GUI Items Creation Start WxStatusBar1 = new wxStatusBar(this, ID_WXSTATUSBAR1); WxStatusBar1->SetFieldsCount(2); WxStatusBar1->SetStatusText(wxT("Netzauslastung"),0); WxStatusBar1->SetStatusText(wxT(""),1); int WxStatusBar1_Widths[2]; WxStatusBar1_Widths[0] = 100; WxStatusBar1_Widths[1] = -1; WxStatusBar1->SetStatusWidths(2,WxStatusBar1_Widths); WxPanel1 = new wxPanel(this, ID_WXPANEL1, wxPoint(0,0), wxSize(115,211), wxTRANSPARENT_WINDOW); WxPanel1->SetForegroundColour(wxColour(*wxBLACK)); WxStaticText1 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT1, wxT("Marktpreis:"), wxPoint(5,185), wxSize(56,17), 0, wxT("WxStaticText1")); WxStaticText1->Enable(false); WxStaticText2 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT2, wxT("Kaufkraft:"), wxPoint(5,166), wxSize(50,17), 0, wxT("WxStaticText2")); WxStaticText2->Enable(false); Kaufkraft = new wxStaticText(WxPanel1, -1, wxT("123"), wxPoint(64,166), wxSize(22,17), 0, wxT("Kaufkraft")); Marktpreis = new wxStaticText(WxPanel1, -1, wxT("456"), wxPoint(64,184), wxSize(22,17), 0, wxT("Marktpreis")); this->SetStatusBar(WxStatusBar1); this->SetSize(8,8,123,264); this->SetTitle(wxT("WIMAX")); this->Center(); this->SetIcon(wxNullIcon); ////GUI Items Creation End } void AuslastungFrm::AuslastungFrmClose(wxCloseEvent& event) { Destroy(); } void AuslastungFrm::DrawCircleRed(wxDC& dc) { dc.SetPen(*wxBLACK_PEN); dc.SetBrush( *wxRED_BRUSH ); dc.DrawCircle(60, 35, 20); dc.SetPen(*wxBLACK_PEN); dc.SetBrush(*wxWHITE_BRUSH); dc.DrawCircle(60, 85, 20); dc.SetPen(*wxBLACK_PEN); dc.SetBrush(*wxWHITE_BRUSH); dc.DrawCircle(60, 135, 20); } void AuslastungFrm::DrawCircleYellow(wxDC& dc) { dc.SetPen(*wxBLACK_PEN); dc.DrawCircle(60, 35, 20); dc.SetPen(*wxBLACK_PEN); wxColour clr(255, 255, 0); wxBrush yellowBrush(clr, wxSOLID); dc.SetBrush(yellowBrush); dc.DrawCircle(60, 85, 20); dc.SetPen(*wxBLACK_PEN); dc.SetBrush(*wxWHITE_BRUSH); dc.DrawCircle(60, 135, 20); } void AuslastungFrm::DrawCircleGreen(wxDC& dc) { dc.SetPen(*wxBLACK_PEN); dc.DrawCircle(60, 35, 20); dc.SetPen(*wxBLACK_PEN); wxColour clr(255, 255, 0); dc.DrawCircle(60, 85, 20); dc.SetPen(*wxBLACK_PEN); dc.SetBrush( *wxGREEN_BRUSH ); dc.DrawCircle(60, 135, 20); } void AuslastungFrm::verbinden() { int rc; SOCKET s; SOCKADDR_IN addr; int startWinsock(void); rc=startWinsock(); s=socket(AF_INET,SOCK_STREAM,0); memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(12345); addr.sin_addr.s_addr=inet_addr("127.0.0.1"); rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); char buf[256]; char buf2[256]; sprintf(buf,"User0815"); send(s,buf,strlen(buf),0); rc=recv(s,buf2,256,0); buf2[rc]='\0'; test_data = atof(buf2); closesocket(s); WSACleanup(); } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); } void AuslastungFrm::OnPaint(wxPaintEvent &WXUNUSED(event)) { wxPaintDC dc(this); if (test_data==1) DrawCircleRed(dc); if (test_data==2) DrawCircleYellow(dc); if (test_data==3) DrawCircleGreen(dc); }
//--------------------------------------------------------------------------- // // Name: AuslastungApp.cpp // Author: Fub // Created: 23.10.2006 15:17:33 // Description: // //--------------------------------------------------------------------------- #include "AuslastungApp.h" #include "AuslastungFrm.h" #include "anmeldungDlg.h" IMPLEMENT_APP(AuslastungFrmApp) //AuslastungFrm* frame; bool AuslastungFrmApp::OnInit() { anmeldungDlg* dialog = new anmeldungDlg(NULL); SetTopWindow(dialog); dialog->Show(true); /* frame = new AuslastungFrm(NULL); //SetTopWindow(frame); frame->Show(true); */ return true; } int AuslastungFrmApp::OnExit() { return 0; }
//--------------------------------------------------------------------------- // // Name: anmeldungDlg.cpp // Author: Fub // Created: 12.11.2006 07:45:47 // Description: // //--------------------------------------------------------------------------- #include "anmeldungDlg.h" //Do not add custom headers //wxDev-C++ designer will remove them ////Header Include Start #include "AuslastungFrm.h" ////Header Include End //---------------------------------------------------------------------------- // anmeldungDlg //---------------------------------------------------------------------------- //Add Custom Events only in the appropriate block. //Code added in other places will be removed by wxDev-C++ ////Event Table Start BEGIN_EVENT_TABLE(anmeldungDlg,wxDialog) ////Manual Code Start ////Manual Code End EVT_CLOSE(anmeldungDlg::anmeldungDlgClose) EVT_BUTTON(ID_WXBUTTON_ABBR,anmeldungDlg::WxButton_AbbrClick) EVT_BUTTON(ID_WXBUTTON_OK,anmeldungDlg::WxButton_OKClick) END_EVENT_TABLE() ////Event Table End anmeldungDlg::anmeldungDlg(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style) : wxDialog(parent, id, title, position, size, style) { CreateGUIControls(); } anmeldungDlg::~anmeldungDlg() {} AuslastungFrm* frame; void anmeldungDlg::CreateGUIControls(void) { //Do not add custom code here //wxDev-C++ designer will remove them. //Add the custom code before or after the blocks ////GUI Items Creation Start this->SetSize(8,8,330,119); this->SetTitle(wxT("Willkommen")); this->Center(); this->SetIcon(wxNullIcon); WxMessageDialog_Anmeldung_fehler = new wxMessageDialog(this, wxT("Anmeldung konnte nicht durchgeführt werden"), wxT("Fehler")); WxButton_Abbr = new wxButton(this, ID_WXBUTTON_ABBR, wxT("Abbrechen"), wxPoint(235,52), wxSize(75,20), 0, wxDefaultValidator, wxT("WxButton_Abbr")); WxButton_OK = new wxButton(this, ID_WXBUTTON_OK, wxT("OK"), wxPoint(235,15), wxSize(75,20), 0, wxDefaultValidator, wxT("WxButton_OK")); WxButton_OK->SetDefault(); password = new wxTextCtrl(this, ID_PASSWORD, wxT(""), wxPoint(99,53), wxSize(121,21), wxTE_PASSWORD, wxDefaultValidator, wxT("password")); user = new wxTextCtrl(this, ID_USER, wxT(""), wxPoint(100,15), wxSize(121,21), 0, wxDefaultValidator, wxT("user")); WxStaticText1 = new wxStaticText(this, ID_WXSTATICTEXT1, wxT("Passwort"), wxPoint(14,52), wxSize(59,20), 0, wxT("WxStaticText1")); WxStaticText1->SetFont(wxFont(10, wxSWISS, wxNORMAL,wxNORMAL, FALSE)); WxStaticText2 = new wxStaticText(this, ID_WXSTATICTEXT2, wxT("Benutzer"), wxPoint(15,15), wxSize(56,20), 0, wxT("WxStaticText2")); WxStaticText2->SetFont(wxFont(10, wxSWISS, wxNORMAL,wxNORMAL, FALSE)); ////GUI Items Creation End } void anmeldungDlg::anmeldungDlgClose(wxCloseEvent& event) { Destroy(); } /* * WxButton_OKClick */ void anmeldungDlg::WxButton_OKClick(wxCommandEvent& event) { // jetzt noch verbindung zur db aufbauen, prüfen ob user vorhanden und dann erst auslastungfrm starten // wenn user nicht vorhanden/password falsch, Anmeldung_fehler und zurück //WxMessageDialog_Anmeldung_fehler->ShowModal(); Destroy(); //Anmeldedialog frame = new AuslastungFrm(NULL); frame->Show(true); } /* * WxButton_AbbrClick */ void anmeldungDlg::WxButton_AbbrClick(wxCommandEvent& event) { WxMessageDialog_Anmeldung_fehler->ShowModal(); Destroy(); }
Für ein paar Vorschläge oder Tips wäre ich aüßerst dankbar!
-
ähm, ne. So nicht.
Verwende bitte einen wxTimer, den kannst du ohne Probleme in deine wxFrame Klasse implementieren:
http://wxwidgets.org/manuals/2.6.3/wx_wxtimerevent.html#wxtimerevent
http://wxwidgets.org/manuals/2.6.3/wx_wxtimer.html#wxtimerIn der OnTimer musst du dann nur nach der Serververbindung Refresh aufrufen, damit sich der Frame neuzeichnet.
phlox
-
Danke!
Der wxTimer funktioniert soweit. Nur beim zeichnen gibt es leider noch ein kleines Problem. Wenn ich die App starte, sieht es so aus als würde er nicht neu zeichnen->Bild 1. Manchmal blitz für eine ms etwas rotes auf, also zeichnet er doch, jedoch wird es dann sofort wieder grau. Wenn ich, während die App läuft das Fenster ständig bewege wird die Ampel angezeigt->Bild 2( wenn der Timer ausgelöst wird und die verbindung gemacht wird hängt das Fenster ganz kurz fest, danach wird dann neu gezeichnet)
Auf den Bildern kann man auch erkennen was ich geändert habe bezüglich des Timers.http://img247.imageshack.us/img247/9606/test1xx5.th.jpg
http://img146.imageshack.us/img146/9683/test2nd6.th.jpg
Gruß
Fabian
-
Hm, wie sieht deine OnPaint aus?
Evtl. solltest du nicht die Controls (statictext etc.)
mit OnPaint Code mischen, versuch mal die Ampel in ein wxPanel
zu zeichnen, das kannst du dann ganz normal über die Sizer einbinden.phlox
-
das ist meine OnPaint()
void AuslastungFrm::OnPaint(wxPaintEvent &WXUNUSED(event)) { wxPaintDC dc(this); if (test_data==1) DrawCircleRed(dc); if (test_data==2) DrawCircleYellow(dc); if (test_data==3) DrawCircleGreen(dc); }
Ist bis auf den Timer alles das gleich wie ich zwei Beitrage weiter oben gepostet hatte...
versuch mal die Ampel in ein wxPanel
zu zeichnen, das kannst du dann ganz normal über die Sizer einbinden.Das versteh ich leider nicht
Hab mir folgendes schon durchgelesen, aber weiter komm ich damit auch nicht.
http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.htmlGruß
Fabian
-
Habe jetzt mal das Panel rauskommentiert, jetzt zeichnet er richitg. Ich brauch das Panel nicht unbedingt, aber später zum anzeigen der Werte wärs schon recht schön. Wie sag ich denn das er auf dem Panel zeichnen soll und nicht "darunter".
Sorry wegen der unqualifizierten frage, aber bin halt doch noch ein anfänger
-
Hm, welches Panel?
Ich seh da nur buttons in der CreateGUIControls,
und wieso nutzt du keine Sizer für die Positionierung?Also für das Zeichnen selber würde ich eine eigene Klasse von wxPanel ableiten,
dort die OnPaint überladen, und nach dem Status entsprechend zeichnen.
Das Panel würdest du dann wieder in den Frame einbetten.
Wenn der Timer im Frame aufgerufen wird, müsste dann nur das jeweilige Panel
den neuen Statuswert erhalten.phlox
-
Hm, ja komisch das Panel ist oben ja wirklich nicht mit drin...
void AuslastungFrm::CreateGUIControls(void) { //Do not add custom code here //wxDev-C++ designer will remove them. //Add the custom code before or after the blocks ////GUI Items Creation Start WxStatusBar1 = new wxStatusBar(this, ID_WXSTATUSBAR1); WxStatusBar1->SetFieldsCount(2); WxStatusBar1->SetStatusText(wxT("Netzauslastung"),0); WxStatusBar1->SetStatusText(wxT(""),1); int WxStatusBar1_Widths[2]; WxStatusBar1_Widths[0] = 100; WxStatusBar1_Widths[1] = -1; WxStatusBar1->SetStatusWidths(2,WxStatusBar1_Widths); //WxPanel1 = new wxPanel(this, ID_WXPANEL1, wxPoint(0,0), wxSize(115,211), wxTRANSPARENT_WINDOW); //WxPanel1->SetForegroundColour(wxColour(*wxBLACK)); //WxStaticText1 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT1, wxT("Marktpreis:"), wxPoint(5,185), wxSize(56,17), 0, wxT("WxStaticText1")); //WxStaticText1->Enable(false); //WxStaticText2 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT2, wxT("Kaufkraft:"), wxPoint(5,166), wxSize(50,17), 0, wxT("WxStaticText2")); //WxStaticText2->Enable(false); //Kaufkraft = new wxStaticText(WxPanel1, -1, wxT("123"), wxPoint(64,166), wxSize(22,17), 0, wxT("Kaufkraft")); //Marktpreis = new wxStaticText(WxPanel1, -1, wxT("456"), wxPoint(64,184), wxSize(22,17), 0, wxT("Marktpreis")); this->SetStatusBar(WxStatusBar1); this->SetSize(8,8,123,264); this->SetTitle(wxT("WIMAX")); this->Center(); this->SetIcon(wxNullIcon); ////GUI Items Creation End }
so siehts momentan aus mit dem auskommentierten panel. wie gesagt, so zeichnet er korrekt!
-
Wie gesagt, ersetze das Panel am besten mit einer von wxPanel abgeleiteten Klasse,
dann müsstest du da keine Probleme mehr haben. Ist auch vom Ansatz her sauberer und leichter zu erweitern.
-
Ok, werd ich mich morgen vormittag mal mit befassen muss jetzt erstmal zur Arbeit...
Gruß
Fabian
-
Hallo,
hab mich heute mal an dem neuen Panel versucht...
Panle.h:
class myPanel : public wxPanel { private: public: myPanel(); virtual ~myPanel(); void SetData(double test_Data); void OnPaint(wxPaintEvent &event); protected: void DrawCircleRed(wxDC& dc); void DrawCircleYellow(wxDC& dc); void DrawCircleGreen(wxDC& dc); };
Panel.cpp
#include "Panel.h" double t_data; myPanel::myPanel() { Create(wxWindow* parent, wxWindowID id = -1, const wxPoint& pos = (0,0), const wxSize& size = (115,211), long style = wxTAB_TRAVERSAL, const wxString& name = "mypanel"); } myPanel::~myPanel() {} void myPanel::SetData(double test_data) { t_data=test_data; Refresh(); } void myPanel::DrawCircleRed(wxDC& dc) { dc.SetPen(*wxBLACK_PEN); dc.SetBrush( *wxRED_BRUSH ); dc.DrawCircle(60, 35, 20); dc.SetPen(*wxBLACK_PEN); dc.SetBrush(*wxWHITE_BRUSH); dc.DrawCircle(60, 85, 20); dc.SetPen(*wxBLACK_PEN); dc.SetBrush(*wxWHITE_BRUSH); dc.DrawCircle(60, 135, 20); } void myPanel::DrawCircleYellow(wxDC& dc) { dc.SetPen(*wxBLACK_PEN); dc.DrawCircle(60, 35, 20); dc.SetPen(*wxBLACK_PEN); wxColour clr(255, 255, 0); wxBrush yellowBrush(clr, wxSOLID); dc.SetBrush(yellowBrush); dc.DrawCircle(60, 85, 20); dc.SetPen(*wxBLACK_PEN); dc.SetBrush(*wxWHITE_BRUSH); dc.DrawCircle(60, 135, 20); } void myPanel::DrawCircleGreen(wxDC& dc) { dc.SetPen(*wxBLACK_PEN); dc.DrawCircle(60, 35, 20); dc.SetPen(*wxBLACK_PEN); wxColour clr(255, 255, 0); dc.DrawCircle(60, 85, 20); dc.SetPen(*wxBLACK_PEN); dc.SetBrush( *wxGREEN_BRUSH ); dc.DrawCircle(60, 135, 20); } void myPanel::OnPaint(wxPaintEvent &WXUNUSED(event)) { wxPaintDC dc(this); if (t_data==1) DrawCircleRed(dc); if (t_data==2) DrawCircleYellow(dc); if (t_data==3) DrawCircleGreen(dc); }
und in meinem Framekonstruktor wird es dann so aufgerufen:
AuslastungFrm::AuslastungFrm(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style) : wxFrame(parent, id, title, position, size, style) { CreateGUIControls(); myPanel panel = new myPanel(); //eigens Panel Zeile44 m_timer =new wxTimer(this, TIMER_ID); m_timer->Start(5000, wxTIMER_CONTINUOUS); // 5 second interval panel.SetData(test_data); }
Das ergibt dann leider mal wieder einen Fehler den ich nicht verstehe
C:\Dev-Cpp\auslastung\AuslastungFrm.cpp In constructor
AuslastungFrm::AuslastungFrm(wxWindow*, wxWindowID, const wxString&, const wxPoint&, const wxSize&, long int)': 44 C:\\Dev-Cpp\\auslastung\\AuslastungFrm.cpp conversion from \
myPanel*' to non-scalar type `myPanel' requested
C:\Dev-Cpp\auslastung\Makefile.win [Build Error] [AuslastungFrm.obj] Error 1
-
new gibt einen Zeiger zurück
-
Es lohnt sich immer den Standardkonstruktor von wxPanel auch in die abgeleiten Klassen zu übernehmen:
myPanel(wxWindow* parent, wxWindowID id , const wxPoint& pos , const wxSize& size , long style , const wxString& name ):wxPanel(parent, id,pos,size, style,name) //wenn man sizer benutzt reicht ein myPanel(wxWindow* parent, wxWindowID id):wxPanel(parent, id)
-
Danke erstmal für die Hinweise!
Haben beiden insofern geholfen,das jetzt ohne Fehler kompiliert wird, er schmeißt nur noch diese Warnung:30 C:\Dev-Cpp\auslastung\myPanel.h [Warning] left-hand operand of comma has no effect
Es hat sich aber jetzt leider das ganze verhalten des Porgramms geändert
. Nach dem ersten clicken auf ok im anmeldedialog wird dieser nicht mehr geschlossen, erst nach dem zweitenmal klicken verschwindet der dialog, was dann aber auch ein zweites HauptFrame nachsich zieht.
Die Ampel wird garnichtmehr gezeichnet und auch die verbindung zum Server kommt nicht mehr zustande! Erst nachdem ich den/die Hauptframme(s) geschlossen habe holt er die Verbindungen nach! Je nachdem wieviel Zeit vergangen ist...Gruß
Fabian
-
Ähm, zeig mal den Frame Konstruktor und die myApp::OnInit.
-
Create(wxWindow* parent, wxWindowID id = -1, const wxPoint& pos = (0,0), const wxSize& size = (115,211), long style = wxTAB_TRAVERSAL, const wxString& name = "mypanel");
Interessante Konstrukte entählt diese Anweisung...
Schau nochmal hin dann weißt du was er mit dieser Warnung meint.
-
Framekonstruktor:
AuslastungFrm::AuslastungFrm(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style) : wxFrame(parent, id, title, position, size, style) { CreateGUIControls(); m_timer =new wxTimer(this, TIMER_ID); m_timer->Start(5000, wxTIMER_CONTINUOUS); // 5 second interval myPanel *panel = new myPanel( this,id=-1,wxPoint(0,0), wxSize(115,211),wxTRANSPARENT_WINDOW,"mypanel"); //eigens Panel panel->SetData(test_data); }
OnInit:
bool AuslastungFrmApp::OnInit() { anmeldungDlg* dialog = new anmeldungDlg(NULL); SetTopWindow(dialog); dialog->Show(true); return true; }
Der Frame wird dann nach click auf OK hier erzeugt:
void anmeldungDlg::WxButton_OKClick(wxCommandEvent& event) { // jetzt noch verbindung zur db aufbauen, prüfen ob user vorhanden und dann erst auslastungfrm starten // wenn user nicht vorhanden/password falsch, Anmeldung_fehler und zurück //WxMessageDialog_Anmeldung_fehler->ShowModal(); Destroy(); //Anmeldedialog frame = new AuslastungFrm(NULL); frame->Show(true); }
@Freak_Coder
der entsprechende Teil sieht jetzt nicht mehr ganz so aus, habe den Konstruktor genommen den phlox81 empfohlen hat sieht man auch oben.
Meinst du mit "Interessante Konstrukte" (0,0) und (115,211)?
Das hab ich so gemacht weil es wxDevcpp auch so angibt wenn ich ein panel über den gui editor einfüge...Gruß
Fabian
-
Irgendwie hast du eine komische Art zu programmieren
Also, in der OnInit auch den Frame erzeugen, und nicht im OnOk handler.
bool AuslastungFrmApp::OnInit() { anmeldungDlg dialog(NULL);// für nen simplen anmeldedialog brauchst du kein new. SetTopWindow(dialog); if(dialog->ShowModal()== wxID_OK) { frame = new AuslastungFrm(NULL); frame->Show(true); return true; } return false; }
Und du solltest dir angewöhnen Sizer für die GUI zu benutzen:
wxFlexGridSizer* fgs = new wxFlexGridSizer(3,1,0,0); fgs->AddGrowableRow(0); fgs->AddGrowableCol(0); myPanel *panel = new myPanel( this,id=-1); //eigens Panel panel->SetData(test_data); fgs->Add(panel, 0, wxEXPAND|wxALL, 5); fgs->Add(statictext1,0,wxEXPAND|wxALL, 5); fgs->Add(statictext2,0,wxEXPAND|wxALL, 5); this->SetSizer(fgs); this->Layout();
Evtl. liesst du dir mal den Artikel im C++ Magazin über wxWidgets durch.
hm, noch eine Frage, warum ist test_data bei dir global, und nicht ein member von mypanel?
phlox