Seite 1 von 2

wxWidgets DeviceContent

Verfasst: Sa Sep 26, 2009 5:23 pm
von hackmack
Hallo,

ich versuche derzeit mit wxWidgets eine Grafik (genauer gesagt eine ".bmp"-Datei) anzuzeigen. Dies mache ich indem ich indem ich ein Image erzeuge, dieses in ein Bitmap konvertiere und dann über den Device Content auf den Frame zeichne:

Code: Alles auswählen

bool mainFrame::loadImage(const wxChar *filename)
{
    wxImage image(filename);
    wxBitmap bitmap(image);
    wxClientDC dc(this);
    dc.DrawBitmap(bitmap, 1, 1, false);
}
Dies funktioniert auch ganz prima, allerdings würde ich gerne das Bild nicht direkt auf den Frame zeichnen, sondern auf ein Panel, damit ich auch noch andere Elemente (bspw. Buttons) in das Frame legen kann. Allerdings wird dann das Bild nicht mehr gezeichnet (bzw. ich seh nur das Panel):

Hier mal der Code:

gui.cpp

Code: Alles auswählen

#include "gui.h"
#include <wx/wx.h>
#include <wx/dc.h>
#include <wx/image.h>
#include <wx/bitmap.h>
#include <wx/defs.h>

BEGIN_EVENT_TABLE(mainFrame, wxFrame)
    EVT_MOTION(mainFrame::onMotion)
END_EVENT_TABLE()


bool mainApp::OnInit()
{
    mainFrame *frame = new mainFrame(wxT("GUI"), wxPoint(-1, -1), wxSize(800, 700));
    frame->Show(true);
    this->SetTopWindow(frame);
    return true;
    ::wxInitAllImageHandlers();
}
mainFrame::mainFrame(const wxChar *title, wxPoint pos, wxSize size) : wxFrame((wxFrame *)NULL, -1, title, pos, size)
{
    mainPanel = new wxPanel(this, wxID_ANY, wxDefaultPosition, size);
    this->loadImage(wxT("karte.bmp"));
}


bool mainFrame::loadImage(const wxChar *filename)
{
    wxImage image(filename);
    wxBitmap bitmap(image);
    wxClientDC dc(this->mainPanel);
    dc.DrawBitmap(bitmap, 1, 1, false);
}

void mainFrame::onMotion(wxMouseEvent &event)
{
    this->loadImage(wxT("karte.bmp"));
}

mainFrame::~mainFrame()
{
}
gui.h

Code: Alles auswählen

#include <wx/wx.h>
#ifndef GUI_H
#define GUI_H

class mainApp : public wxApp
{
    public:
        virtual bool OnInit();
};



class mainFrame : public wxFrame
{
    private:
        wxPanel *mainPanel;
        DECLARE_EVENT_TABLE()
    public:
        mainFrame(const wxChar *title, wxPoint pos, wxSize size);
        bool loadImage(const wxChar *filename);
        ~mainFrame();
        void onMotion(wxMouseEvent &event);
};
#endif
und schlußendlich noch die main.cpp

Code: Alles auswählen

#include "gui.h"
#include <wx/wx.h>

IMPLEMENT_APP(mainApp)
Hat jemand eine Idee, woran das liegen könnte und was man dagegen macht? ;)

Mfg.
hackmack

Re: wxWidgets DeviceContent

Verfasst: So Okt 25, 2009 5:18 pm
von hackmack
Habe jetzt eine Möglichkeit gefunden, auf dem Bild (welches mit einem DeviceContent gezeichnet wurde), trotzdem noch Buttons und andere Controls abzulegen. Dabei geht man folgendermaßen vor:
  • Man erzeugt kein Panel (wie ich oben gedacht habe), sondern man erzeugt ein Objekt der Klasse wxWindow direkt auf dem Frame. Dieses nimmt dann automatisch den ganzen Platz in dem Frame ein.
  • Auf dieses wxWindow Objekt wird dann der Button draufgesetzt und das Bild gezeichnet.

Hier mal der geänderte Code (bin mir nicht sicher ob er compiliert, da mein aktuell verwendeter Code schon wieder ganz anders aussieht als der obige):

gui.h

Code: Alles auswählen

    #include <wx/wx.h>
    #ifndef GUI_H
    #define GUI_H

    class mainApp : public wxApp
    {
        public:
            virtual bool OnInit();
    };



    class mainFrame : public wxFrame
    {
        private:
			wxWindow *window123;
			wxButton *button1;
            DECLARE_EVENT_TABLE()
        public:
            mainFrame(const wxChar *title, wxPoint pos, wxSize size);
            bool loadImage(const wxChar *filename);
            ~mainFrame();
            void onMotion(wxMouseEvent &event);
    };
    #endif

gui.cpp

Code: Alles auswählen

    #include "gui.h"
    #include <wx/wx.h>
    #include <wx/dc.h>
    #include <wx/image.h>
    #include <wx/bitmap.h>
    #include <wx/defs.h>

    BEGIN_EVENT_TABLE(mainFrame, wxFrame)
        EVT_MOTION(mainFrame::onMotion)
    END_EVENT_TABLE()


    bool mainApp::OnInit()
    {
        mainFrame *frame = new mainFrame(wxT("GUI"), wxPoint(-1, -1), wxSize(800, 700));
        frame->Show(true);
        this->SetTopWindow(frame);
        return true;
        ::wxInitAllImageHandlers();
    }
    mainFrame::mainFrame(const wxChar *title, wxPoint pos, wxSize size) : wxFrame((wxFrame *)NULL, -1, title, pos, size)
    {
        this->window123 = new wxWindow(this, wxID_ANY);
		this->button1 = new wxButton(window123, wxID_OK, wxT("Button"));
        this->loadImage(wxT("karte.bmp"));
    }


    bool mainFrame::loadImage(const wxChar *filename)
    {
        wxImage image(filename);
        wxBitmap bitmap(image);
        wxClientDC dc(this->window123);
        dc.DrawBitmap(bitmap, 1, 1, false);
    }

    void mainFrame::onMotion(wxMouseEvent &event)
    {
        this->loadImage(wxT("karte.bmp"));
    }

    mainFrame::~mainFrame()
    {
    }

Mit wxWindow funktioniert es schätzungsweise deswegen, da wxWindow sich nicht automatisch neuzeichnet (im Gegensatz zu wxPanel).

Re: wxWidgets DeviceContent

Verfasst: So Okt 25, 2009 5:30 pm
von Xin
Mööp.

Ich sehe den Thread erst jetzt - aber ich verstehe auch nicht ganz, was Du da tun möchtest. Möchtest Du Deinem Fenster einen Hintergrund vergpassen?

Re: wxWidgets DeviceContent

Verfasst: So Okt 25, 2009 6:55 pm
von hackmack
Ja, so ungefähr. Ich habe versucht, ein (fensterfüllendes) Bild anzuzeigen. Auf diesem Bild können dann Koordinaten eingezeichnet werden. Ich habe allerdings noch Buttons gebraucht (welche logischerweise über den Bild liegen müssen, aber auch nicht das ganze Bild verdecken dürfen), die man anklicken kann, um bspw. Koordinaten zu löschen oder mit Namen zu versehen.

Außerdem habe ich grade einen Bug (nämlich, dass sich das Programm dank einer Endlosschleife nicht mehr beenden lässt) im obigen Code entdeckt, habe ihn inzwischen auch gefixt und alles funktioniert wie's soll. Ich werde die Korrektur in den nächsten Tagen mal posten.

Re: wxWidgets DeviceContent

Verfasst: So Okt 25, 2009 8:29 pm
von Xin
hackmack hat geschrieben:Ja, so ungefähr. Ich habe versucht, ein (fensterfüllendes) Bild anzuzeigen. Auf diesem Bild können dann Koordinaten eingezeichnet werden. Ich habe allerdings noch Buttons gebraucht (welche logischerweise über den Bild liegen müssen, aber auch nicht das ganze Bild verdecken dürfen), die man anklicken kann, um bspw. Koordinaten zu löschen oder mit Namen zu versehen.

Außerdem habe ich grade einen Bug (nämlich, dass sich das Programm dank einer Endlosschleife nicht mehr beenden lässt) im obigen Code entdeckt, habe ihn inzwischen auch gefixt und alles funktioniert wie's soll. Ich werde die Korrektur in den nächsten Tagen mal posten.
Magst Du den Teil im Wiki beschreiben? Noch gibt es nicht viel zu wxWidgets, aber das muss ja nicht so bleiben und vorhandenes Know-How muss nicht im Chaos des Forums verloren gehen.

Re: wxWidgets DeviceContent

Verfasst: So Okt 25, 2009 8:33 pm
von hackmack
hmmm....ok....ich füge es mal zu meiner TODO Liste dazu.

Dann sollte man aber allgemein den wxWidgets Teil verbessern, da so ein Mini-Teil auch nicht so viel bringt. Ich werde mal schauen, wie viel Zeit ich in den Herbstferien dazu finde.

Re: wxWidgets DeviceContent

Verfasst: So Okt 25, 2009 9:16 pm
von Xin
hackmack hat geschrieben:hmmm....ok....ich füge es mal zu meiner TODO Liste dazu.

Dann sollte man aber allgemein den wxWidgets Teil verbessern, da so ein Mini-Teil auch nicht so viel bringt. Ich werde mal schauen, wie viel Zeit ich in den Herbstferien dazu finde.
Ich wäre sehr dankbar, wenn der wxWidgets-Teil wachsen würde. Ich kann leider nur sinnvoll an den Projekten schreiben, mit denen ich mich zur Zeit selbst gerade beschäftige.

Herbstferien... hatten wir die nicht gerade? Wo kommst Du denn her?

Re: wxWidgets DeviceContent

Verfasst: So Okt 25, 2009 9:48 pm
von hackmack
Baden-Württemberg, und da haben die (endlich :D ) vor 2 Tagen angefangen. Dass ich in den Herbstferien mit dem Teil noch wirklich anfangen kann, bezweifel ich aber eher, da ich auch noch einiges für die Schule machen muss.

Re: wxWidgets DeviceContent

Verfasst: Mi Apr 07, 2010 8:46 am
von Xin
Manchmal sind die Spam-Bots doch gut, um alte Threads auszugraben.

Wie sieht's aus im wxWidget-Land?

Re: wxWidgets DeviceContent

Verfasst: Do Apr 08, 2010 5:14 pm
von hackmack
hmmm....naja...mit wxWidgets hab ich in letzter Zeit relativ viel gemacht, allerdings habe ich mir noch überhaupt keine Gedanken für ein Tutorial gemacht. Ich kann mal schauen, dass ich da mal dran mache - mache dir aber in den nächsten paar Wochen keine Hoffnungen, dass da noch was ins Wiki kommt.