einfache Ampel zeichnen...



  • Er malt 😃
    Lag am Panel... hab es jetzt auf transparent gesetzt und es funzt!
    Trotzdem Danke!


  • Mod

    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!?


  • Mod

    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


  • Mod

    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 in

    test_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 😞


  • Mod

    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!


  • Mod

    ä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#wxtimer

    In 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


  • Mod

    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.html

    Gruß
    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 😕


  • Mod

    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!


  • Mod

    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.


Anmelden zum Antworten