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.


  • Mod

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

    Hier 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


  • Mod

    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!


  • 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


Anmelden zum Antworten