einfache Ampel zeichnen...
-
nein, habe noch nicht mit gui kits gearbeitet!
Dann beschäftige Dich einwenig damit. Sieh mal in die FAQ für die verschiedenen Kits. Such Dir eins aus und mach damit mal etwas rum.
Dann sollte auch das Bildermalen kein Problem mehr sein.
-
Also so ne ampel ist recht einfach, du hast eigentlich nur ein Panel was einen zustandswert hat,
und diesen in der OnPaint abfragt, je nach zu stand zeichnest du dann halt entsprechend.
Für wxWidgets hab ich sowas schon mal gemacht, um die Verbindung mit einem Server anzuzeigen.
-
phlox81 schrieb:
Also so ne ampel ist recht einfach, du hast eigentlich nur ein Panel was einen zustandswert hat,
und diesen in der OnPaint abfragt, je nach zu stand zeichnest du dann halt entsprechend.
Für wxWidgets hab ich sowas schon mal gemacht, um die Verbindung mit einem Server anzuzeigen.Hallo,
hast du das für wxWidgets noch...
Ich hab mir jetzt wxDevcpp installiert, aber irgend wie weiß ich immer noch nicht wie ich auf dem panel zeichnen soll
Konnte auch kein Beispiel oder Tutorial finden! Auch im Manual finde ich keine Functionen mit denen es sich zeichnen lässt.Am besten wäre für mich ein Code Beispiel oder Auszug, lerne so am schnellsten.
Danke & Gruß
Fabian
-
Ich bins nochmal...
habe jetzt ein Beispiel gefunden in dem gezeichnet wird!
Daraus hab ich mir ein paar sachen kopiert, wird auch ohne Probleme kompilert und ausgeführt. Das Fenster erscheint auch, nur wird halt nicht gezeichnetHier der Code:
//--------------------------------------------------------------------------- // // 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 //#include "wx/colordlg.h" //#include "wx/image.h" //#include "wx/artprov.h" ////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 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(); } AuslastungFrm::~AuslastungFrm() {} 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(1); WxStatusBar1->SetStatusText(wxT("Netzauslastung"),0); int WxStatusBar1_Widths[1]; WxStatusBar1_Widths[0] = -1; WxStatusBar1->SetStatusWidths(1,WxStatusBar1_Widths); WxPanel1 = new wxPanel(this, ID_WXPANEL1, wxPoint(0,0), wxSize(115,200)); this->SetStatusBar(WxStatusBar1); this->SetSize(8,8,123,253); this->SetTitle(wxT("WIMAX")); this->Center(); this->SetIcon(wxNullIcon); ////GUI Items Creation End } void AuslastungFrm::AuslastungFrmClose(wxCloseEvent& event) { Destroy(); } void AuslastungFrm::DrawCircles(wxDC& dc) { int x = 100, y = 100, r = 20; dc.SetPen(*wxBLACK_PEN); dc.SetBrush( *wxRED_BRUSH ); dc.DrawCircle(x, y, r); } void AuslastungFrm::OnPaint(wxPaintEvent &WXUNUSED(event)) { wxPaintDC dc(this); DrawCircles(dc); }
muss ich OnPaint irgendwie explizit aufrufen? Gibt es irgendwo eine Doku was genau die Paint Methoden z.B. SetBrush, SetPen usw. machen?
Danke & Gruß
Fabian
-
Müsste eigentlich funktionieren...
Das ist mein Statuspanel:
header:#ifndef StatusPanel_h #define StatusPanel_h #include <wx/panel.h> #include <wx/stattext.h> #include <wx/wx.h> /*Klassenname:StatusPanel Autor: Jens Weller Datum: Kommentar:This Panel simply shows the Status its in. Green for Ready, Read for not ready...*/ class StatusPanel : public wxPanel { bool status; wxColour ready; wxColour not_ready; wxStaticText* msg; protected: public: StatusPanel(wxWindow* parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL, const wxString& name = "panel"); virtual ~StatusPanel(); virtual void SetStatus(bool status); }; #endif
cpp:
#include "StatusPanel.hpp" StatusPanel::StatusPanel(wxWindow* parent, wxWindowID id , const wxPoint& pos , const wxSize& size , long style , const wxString& name ):wxPanel(parent, id,pos,size, style,name) { ready.Set(0,200,0); not_ready.Set(200,0,0); wxBoxSizer *bSizer9; bSizer9 = new wxBoxSizer(wxVERTICAL); msg = new wxStaticText(this, -1,wxT("Not Ready"), wxDefaultPosition, wxDefaultSize, 0); msg->SetBackgroundColour(not_ready); SetBackgroundColour(not_ready); bSizer9->Add(msg, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); bSizer9->Fit(this); this->SetSizer(bSizer9); this->SetAutoLayout(true); this->Layout(); } StatusPanel::~StatusPanel() { } void StatusPanel::SetStatus(bool status) { if(status) { SetBackgroundColour(ready); msg->SetLabel("Ready"); msg->SetBackgroundColour(ready); } else { SetBackgroundColour(not_ready); msg->SetLabel("Not Ready"); msg->SetBackgroundColour(not_ready); } }
phlox
-
phlox81 schrieb:
Müsste eigentlich funktionieren...
phlox
Tut es aber leider nicht
Hier ist noch der dazugehörige Header://Do not add custom headers //wxDev-C++ designer will remove them ////Header Include Start #include <wx/panel.h> #include <wx/statusbr.h> ////Header Include End ////Dialog Style Start #undef AuslastungFrm_STYLE #define AuslastungFrm_STYLE wxALWAYS_SHOW_SB | wxCAPTION | wxSYSTEM_MENU | wxCLOSE_BOX ////Dialog Style End class AuslastungFrm : public wxFrame { private: DECLARE_EVENT_TABLE(); public: AuslastungFrm(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("Auslastung"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = AuslastungFrm_STYLE); virtual ~AuslastungFrm(); public: //Do not add custom control declarations //wxDev-C++ will remove them. Add custom code after the block. ////GUI Control Declaration Start wxPanel *WxPanel1; wxStatusBar *WxStatusBar1; ////GUI Control Declaration End public: //Note: if you receive any error with these enum IDs, then you need to //change your old form code that are based on the #define control IDs. //#defines may replace a numeric value for the enum names. //Try copy and pasting the below block in your old form header files. enum { ////GUI Enum Control ID Start ID_WXPANEL1 = 1002, ID_WXSTATUSBAR1 = 1001, ////GUI Enum Control ID End ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values }; public: void AuslastungFrmClose(wxCloseEvent& event); void CreateGUIControls(void); void DrawCircles(wxDC& dc); void OnPaint(wxPaintEvent &event); }; #endif
Und hier der Header und Source der zugehörigen Application.
Header://--------------------------------------------------------------------------- // // Name: AuslastungApp.h // Author: Fub // Created: 23.10.2006 15:17:33 // Description: // //--------------------------------------------------------------------------- #ifndef __AuslastungApp_h__ #define __AuslastungApp_h__ #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include <wx/wx.h> #else #include <wx/wxprec.h> #endif class AuslastungFrmApp : public wxApp { public: bool OnInit(); int OnExit(); }; #endif
Source:
//--------------------------------------------------------------------------- // // Name: AuslastungApp.cpp // Author: Fub // Created: 23.10.2006 15:17:33 // Description: // //--------------------------------------------------------------------------- #include "AuslastungApp.h" #include "AuslastungFrm.h" IMPLEMENT_APP(AuslastungFrmApp) bool AuslastungFrmApp::OnInit() { AuslastungFrm* frame = new AuslastungFrm(NULL); SetTopWindow(frame); frame->Show(true); return true; } int AuslastungFrmApp::OnExit() { return 0; }
Vielleicht hifts ja bei der Fehlersuche...
Danke & Gruß
Fabian
-
Er malt
Lag am Panel... hab es jetzt auf transparent gesetzt und es funzt!
Trotzdem Danke!
-
Wenn du die OnPaint überschreibst, solltest du immer von wxPanel oder wxScrollWindow ableiten,
dann ist es auch universeller einsetzbar.
-
Ich muss hier nochmal nachhacken...
void AuslastungFrm::OnPaint(wxPaintEvent &WXUNUSED(event)) { 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)); // zuerst alles auf 0 setzten addr.sin_family=AF_INET; addr.sin_port=htons(12345); // wir verwenden mal port 12345 addr.sin_addr.s_addr=inet_addr("127.0.0.1"); // zielrechner ist unser eigener 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'; int test_data; test_data=int(buf2); closesocket(s); WSACleanup(); wxPaintDC dc(this); //Marktpreis->SetLabel(data); if (test_data==1) DrawCircleRed(dc); if (test_data==2) DrawCircleYellow(dc); if (test_data==3) DrawCircleGreen(dc); }
Das funktioniert nicht
Ich weiß, ist nicht gerade schön, eigentlich habe ich die socket geschichte in einem Thread ausgelagert und rufe dann hier nur eine verbinden() Methode auf.
Aber hab das jetzt zwecks Fehlersuche Kompakter gemacht...
Was er eigentlich tun soll ist, je nachdem welchen wert ein Server sendet(und der sendet) eben den entsprechenden Kreis zeichnen...
Ich denke hier ist was grundlegendes Falsch!?
-
Hm, also ich halte es nicht so klug sich bei jedem repaint auf den Server zu verbinden.
Evtl. solltest du das statusmanagment von einem Timer oder eigenen Thread erledigen lassen,
oder einen Timer einen Thread starten lassen, der dann die Stati vom Server holt.
Das Ampelpanel selber sollte dann nur entsprechend der vom Timer/Thread ermittelten Werte gezeichnet werden.
Und warum verwendest du nicht gleich wxSocket? Damit wärst du sogar plattformunabhängig.phlox
-
Das soll ja auch nicht so bleiben, aber es funktioniert ja noch nicht einmal so...
Im enddefekt wird das auch ein thread werden der dann durch einen Timer alle 60sec gestartet wird.
Wie sage ich denn dem Panel das es neu zeichenen muss da sich die werte geändert haben? Muss ich da ein Paint Event aufrufen/setzen? Wenn ja wie macht man das...
wxSocket will ich später auch verwenden, nur hab ich da noch keine Beispiele oder Tutorials zu gefunden, und da ich mich noch nicht so gut mit der ganzen Materie auskennen hab ich es erstmal so gemacht.Danke & Gruß
Fabian
-
Einfach Refresh() aufrufen.
Ich weiss auch nicht ob es so klug ist, eine Socketverbindung in der OnPaint Methode aufzurufen.wxSocket ist recht einfach.
Gibt sogar ein FAQ/Tutorial dazu im wxForum.
-
Hab jetzt die Socketverbindung aus der OnPaint in eine eigene Methode genommen und darin wieder in einen Thread.
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); }
void AuslastungFrm::verbinden() { CreateThread(0, 0, ThreadFunc, (LPVOID) test_data, 0, 0); }
DWORD WINAPI ThreadFunc(LPVOID data) { 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=int(buf2); closesocket(s); WSACleanup(); return test_data; }
Meine Application Class sieht so aus
IMPLEMENT_APP(AuslastungFrmApp) AuslastungFrm* frame; bool AuslastungFrmApp::OnInit() { frame = new AuslastungFrm(NULL); SetTopWindow(frame); frame->Show(true); return true; } int AuslastungFrmApp::OnRun() { while(1){ frame->verbinden(); Sleep(5000); frame->Refresh(); } return 0; } int AuslastungFrmApp::OnExit() { return 0; }
Es funktioniert einfach nicht und ich habe keine Ahnung warum nicht
-
Hab gerade den Debugmodus entdeckt
und da kommt test_data=18217980
Der Server sendet aber nur 1,2, oder 3. Das sind allerdings char.
Mache ich was beim casten falsch?
-
fub0815 schrieb:
Mache ich was beim casten falsch?
Jaa
Du kannst nicht einfach einen C-String mit nem einfach int() cast umwandeln.
Wenn du dir sicher bist das in buf2[0] die benötigte Zahl steht, reicht ein einfaches:int test_data = (int)buf2[0] - 48;
Ansonste C++ FAQ -> Einmal von String zu Zahl ( oder so ähnlich )
Edit: Uups Array-Index vergessen
-
@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