wxWidgets DeviceContent

z.B. wxWidgets, GTK+, Qt, OpenGL, DirectX
Benutzeravatar
hackmack
Beiträge: 85
Registriert: Do Mär 26, 2009 10:16 pm

wxWidgets DeviceContent

Beitrag von hackmack » Sa Sep 26, 2009 5:23 pm

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
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.

Benutzeravatar
hackmack
Beiträge: 85
Registriert: Do Mär 26, 2009 10:16 pm

Re: wxWidgets DeviceContent

Beitrag von hackmack » So Okt 25, 2009 5:18 pm

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).
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8488
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: wxWidgets DeviceContent

Beitrag von Xin » So Okt 25, 2009 5:30 pm

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?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
hackmack
Beiträge: 85
Registriert: Do Mär 26, 2009 10:16 pm

Re: wxWidgets DeviceContent

Beitrag von hackmack » So Okt 25, 2009 6:55 pm

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.
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8488
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: wxWidgets DeviceContent

Beitrag von Xin » So Okt 25, 2009 8:29 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
hackmack
Beiträge: 85
Registriert: Do Mär 26, 2009 10:16 pm

Re: wxWidgets DeviceContent

Beitrag von hackmack » So Okt 25, 2009 8:33 pm

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.
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8488
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: wxWidgets DeviceContent

Beitrag von Xin » So Okt 25, 2009 9:16 pm

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?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
hackmack
Beiträge: 85
Registriert: Do Mär 26, 2009 10:16 pm

Re: wxWidgets DeviceContent

Beitrag von hackmack » So Okt 25, 2009 9:48 pm

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.
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8488
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: wxWidgets DeviceContent

Beitrag von Xin » Mi Apr 07, 2010 8:46 am

Manchmal sind die Spam-Bots doch gut, um alte Threads auszugraben.

Wie sieht's aus im wxWidget-Land?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
hackmack
Beiträge: 85
Registriert: Do Mär 26, 2009 10:16 pm

Re: wxWidgets DeviceContent

Beitrag von hackmack » Do Apr 08, 2010 5:14 pm

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.
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.

Antworten