wxWidgets: Bitmap als Hintergrund



  • Hallo zusammen!

    Ich bräuchte mal wieder ein wenig Schützenhilfe. 🙄
    Ein paar Sätze zu meinem Vorhaben: Die wunderbare Flugsimulation IL-2 bietet die Möglichkeit der Kommunikation mit externer Software über das UDP-Protokoll. So können alle wichtigen Flugparameter ausgelesen und auch Steuereingaben an das Flugzeug zurückgegeben werden.
    Nun habe ich ein Programm geschrieben welches auf einem zweiten Computer im Netzwerk (neben dem auf dem die Simulation läuft) ausgeführt wird und die Funktion des in der B-17 eingebauten C-1 Autopiloten übernimmt. Das funktioniert soweit auch sehr ordentlich, nur das Windows-Design passt natürlich nicht in einen Bomber aus dem zweiten Weltkrieg. 🙂
    Und hier setzt meine Frage an: Bietet wxWidgets eine Möglichkeit ein Bild (z.B. ein bitmap) als Hintergrund des Frames zu verwenden?

    Hier mal ein Beispielbild (da gibts auch schönere 🙂 ):
    http://b17panels.com/images/c1autopilot/c-1plan.jpg

    Auf der linken Seite des Autopiloten findet sich eine Reihe von Kippschaltern. Ist es weiterhin möglich über z.B. einen Button das Bild eines solchen Kippschalters zu legen, sodass bei einem Mausklick darauf der Schalter umgelegt wird?

    Ich bin recht neu bei wxWidgets und der schiere Umfang erschlägt einen Neuling ja förmlich.
    Daher bitte ich um ein wenig Hilfe etwas Licht in den wx-Dschungel zu bringen und mich auf den richtigen Weg bei meinem Vorhaben zu bringen. 🙂

    Vielen Dank,
    Alberich


  • Mod

    Ja, das kann man.
    Du musst dafür den OnPaint Event überschreiben, und das Bild per DrawBitmap auf den DC zeichnen.
    Ebenso solltest du den Event OnEraseBackground überladen, und dort nichts tun.



  • Super, vielen Dank! Der erste Versuch hat hingehauen!
    Ich benutze CodeBlocks und wxSmith, klappt prima nachdem ich mich mit den Sizern angefreundet hab. 🙂
    Auf dem Frame liegt nur ein Panel (Panel1), dessen OnPaint event sieht so aus:

    void TESTFrame::OnPanel1Paint(wxPaintEvent& event)
    {
        wxPaintDC DC( Panel1 );
        wxBitmap background("test.bmp", wxBITMAP_TYPE_BMP);
        DC.DrawBitmap(background, 0, 0, false);
    }
    

    Nun schreibst du dass ich den OnEraseBackground event überschreiben und dort nichts tun soll soll. Was meinst du damit genau? Leer sieht dieser event so aus:

    void TESTFrame::OnPanel1EraseBackground(wxEraseEvent& event)
    {
    }
    

    Soll das also einfach leer bleiben?

    Ach ja, noch ne Kleinigkeit. Ich möchte gerne dass der Frame nicht in seiner Größe (durch "ziehen" am Rand) verändert werden kann. Wo und wie kann ich das festlegen?

    Vielen Dank!
    Alberich


  • Mod

    Der Grund warum du den EraseBackground Event überschreibst, ist zu verhindern, das der Standardcode dort ausgeführt wird, deshalb lässt du die Funktion auch leer.

    Für die Größe: SetMinSize bzw. SetMaxSize nutze ich hier i.d.R.



  • OK, dann passt das so also. *Freu* 🙂

    Jetzt liegt das Bitmap "test.bmp" im gleichen Ordner wie die TEST.exe. Gibt es eine Möglichkeit das Bitmap beim Compilieren in die .exe mit einzubinden? Ich glaube das Bild kann man über das file "recource.rc" einbinden, ich habe aber keine Ahnung wie.
    Im Moment sieht dieses file so aus:

    aaaa ICON "wx/msw/std.ico"
    
    #include "wx/msw/wx.rc"
    

    Wie könnte ich der .exe das Bild "mitgeben" und wie komme ich dann wieder an das Bild ran um es zu zeichnen?

    Bitte entschuldigt meine dusseligen Anfängerfragen 🙂


Anmelden zum Antworten