nochmal wxWindows



  • Kennt sich irgendjemand aus mit diesem "Device Context" - Zeugs bzw. mit wxImage.
    Ich brauche ein Steuerelement, das eine Karte anzeigen kann und dann soll noch ein anklickbarer (das heißt, es soll bei Klick ein Event ausgelöst werden) Punkt (mehrere Pixel groß) darauf positioniert werden können.

    Ich hab auch fleißig meinen Device Context erstellt und wollte dann mal zum Testen darauf rummalen, es wurde aber nix angezeigt.

    Meine Vorgehensweise war die Folgende: Ich hab eine neue Klasse erstellt und von wxPanel abgeleitet. Danach im Konstruktor einen wxClientDc erstellt und diesem den this-Zeiger übergeben. Die ganzen Draw-Methoden haben aber keinerlei Auswirkung.
    Zugegebenermaßen bin ich mir überhaupt nicht im Klaren, wie das mit den DC's gedacht ist. Die Doku ist da auch nicht besonders hilfreich. Ein Beispiel wärs halt gewesen.

    Am besten wär irgendein Link auf ein Tutorial oder so was, ich hab da selber noch nix gefunden.



  • Ich bin mir zwar nicht ganz im Klaren was du genau suchst, hoffe aber, daß dir folgendes hilft:

    #include "wx/wxprec.h"
    
    #ifdef __BORLANDC__
    #pragma hdrstop
    #endif
    
    #ifndef WX_PRECOMP
    #include "wx/wx.h"
    #endif
    
    class MyApp: public wxApp
    {
    public:
        virtual bool OnInit();
    };
    
    class MyCanvas: public wxScrolledWindow
    {
    public:
        MyCanvas(wxWindow* parent);
        void OnMouseLeftUp (wxMouseEvent & event);
    private:
        DECLARE_EVENT_TABLE()
    };
    
    class MyFrame: public wxFrame
    {
    public:
        MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
        void OnQuit (wxCommandEvent &);
        DECLARE_EVENT_TABLE()
    };
    
    enum
    {
        ID_Quit = 1,
    };
    
    BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
        EVT_LEFT_UP (MyCanvas::OnMouseLeftUp)
    END_EVENT_TABLE()
    
    BEGIN_EVENT_TABLE(MyFrame, wxFrame)
        EVT_MENU (ID_Quit, MyFrame::OnQuit)
    END_EVENT_TABLE()
    
    IMPLEMENT_APP(MyApp)
    
    bool MyApp::OnInit()
    {
        MyFrame *frame = new MyFrame (_T("Test"),
                                      wxPoint(20,20), wxSize(600,450));
        frame->Show (TRUE);
        SetTopWindow (frame);
        return TRUE;
    }
    
    MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
        : wxFrame((wxFrame *)NULL, -1, title, pos, size)
    {
        new MyCanvas(this);
    }
    
    void MyFrame::OnQuit (wxCommandEvent &)
    {
        Close (TRUE);
    }
    
    MyCanvas::MyCanvas(wxWindow* parent):
      wxScrolledWindow(parent, -1)
    {
        SetBackgroundColour (wxColour (0,0,255));
        Clear();
    }
    
    void MyCanvas::OnMouseLeftUp (wxMouseEvent & event)
    {
    		MyFrame* frame = (MyFrame*) GetParent();
    		char buf[11];
    		sprintf(buf,"(%i,%i)",event.m_x,event.m_y);
    		wxMessageBox(_T(buf), _T(""), wxOK, this);
    }
    

    Und ja, der Code ist zusammengefriemelt 😃



  • Danke, das ist schon mal ein Anfgang.
    Ich brauch das ganze halt als Steuerelement, sprich zum Beispiel basierend auf wxPanel. im Hintergrund soll dann eine Deutschlandkarte sein, auf der ein Punkt positioniert werden kann. Diesen Punkt soll dann klickbar sein, d.h. es soll ein bestimmtes Erignis ausgelöst werden können, wenn man auf den Punkt klickt.
    Mein Hauptproblem dabei ist, dass ich das mit dem Bild einfach nicht hinkriege. Der Doku entnehme ich, dass es irgendwie mit wxImage und wxDc zusammen hängt, aber wie das genau funktioniert steht da nicht.
    Die Karte ist übrigens ein Bild im jpeg-Format.



  • Unter samples/rotate findest du ein schönes Beispielprogramm; da kannst du dir eigentlich alles abgucken, was du suchst.
    Mußt nur wxBITMAP_TYPE_BMP durch wxBITMAP_TYPE_JPEG ersetzen, der Rest dürfte dann kein Problem sein...



  • Und wenn du dir dann noch die Memberfunktionen von wxDC anschaust, wirst du alles finden, was du zum Zeichnen brauchst 🙂



  • Danke für den Tip mit dem Beispiel.
    Das war schon nahe dran. Das Problem an dem Beispiel ist, dass die Karten, die da mit Mausklicks positioniert werden können, wieder verschwinden, wenn man zum Beispiel das Fenster übder den Bildschirmrand hinaus verschiebt.
    Hab aber schon eine Lösung gefunden: Einfach statt wxClientDc den wxPaintDc mit entprechedem Event-Handling verwenden, dann bleibt das Bild auch dauerhaft da.


Anmelden zum Antworten