[wxWidgets] Bitmap einbinden + wxGauge Position + Menubarfarbe



  • Hallo allerseits.

    Habe eine Bitmap als Hintergrund in die Clientarea eingebunden.

    wxBitmap bmp(wxT("test.jpg"), wxBITMAP_TYPE_JPEG);
    wxStaticBitmap *sb = new wxStaticBitmap(sw, -1, bmp);
    

    funktioniert auch, allerdings scheint es den wxGauge zu überblenden sprich die weiße Umrandung dieser.. Wenn ich das Fenster ein paar mal minimiere und maximiere erscheint die Umrandung, später verschwindet sie wieder.. Woran liegt das? Was lässt sich da machen?

    Die wxGauge Position lässt sich auch nicht verändern, bzw. wxBottom setzt den Gauge nicht nach unten in die Clientarea (setzt es nach links oben an den rand.. wxLeft, wxRight dagegen geht)

    Gibt es ne möglichkeit die Menubar einzufärben? Habe es so versucht

    wxMenuBar *item0 = new wxMenuBar;
    item0->SetBackgroundColour(wxT("Black"));
    

    funktioniert aber nicht.
    So das wars erstmal. Danke.


  • Mod

    Meines Erachtens müsstest du das Hintergrundbild in einer OnPaint Methode zeichnen, wenn du willst, das Childwindows davon nicht betroffen sind.



  • void MyFrame::OnPaint(wxPaintEvent &event)
    {
        wxBitmap bmp(wxT("test.jpg"), wxBITMAP_TYPE_JPEG);
        wxStaticBitmap *sb = new wxStaticBitmap(sw, -1, bmp);
    
        // in MyFrame::MyFrame
        panel->Connect(wxEVT_PAINT, wxPaintEventHandler(MyFrame::OnPaint), NULL, this); 
    }
    

    Ist das so gemeint? Funktioniert jedenfalls nicht. Zeichnen tut ers nur in die linke obere Ecke beim minimieren und maximieren erscheint es kurz und verschwindet wieder, close menübutton geht nicht... 50% cpu-auslastung..

    Aber das StaticBitmap muss doch auch nur einmal gezeichnet werden? Nicht alle paar frames.. 😕



  • Die Menübar-Farbe kann man in Windows nicht so einfach ändern.

    OnPaint wird nur aufgerufen, wenn das Fenster bzw. teile davon neu gezeichnet werden müssen. Und dort kannst du kein Control (wxStaticBitmap) anlegen!
    Du musst das Bild mittels wxDC zeichnen und das besser in OnEraseBackground():

    m_bmpBG = new wxBitmap(...)
    
    void MyFrame::OnEraseBackground(wxEraseEvent& event)
    {
    
    wxDC* dc = event.GetDC();
    
    wxSize sz = GetClientSize();
    
    dc->DrawBitmap(*m_bmpBG, 0, 0, false);
    
    }
    

    Noch den EventHandler EVT_ERASE_BACKGROUND hinzufügen!



  • Danke Softwaremaker, funktioniert jetzt einwandfrei. Benutze als myframe-style ja wxSYSTEM_MENU davon lässt sich nicht die Farbe ändern? Hat wer mit der wxGauge-bar das gleiche Problem? Das sie sich nicht nacht unten positionieren lässt? (wxBottom)

    Danke nochmal an alle.


  • Mod

    Hm, Softwaremaker hat da recht.

    Und ich glaube du solltest dir mal die Tutorials zu wxWidgets im Magazin ansehen da wird das auch mit dem PaintEvent erklärt.



  • Danke phlox81, ist nen super Artikel, sehr gut erklärt (Hatte aber noch nicht die Zeit alles durchzulesen, werde ich aber noch nachholen :))

    Hab mal noch eine Frage, gibts ne Funktion um den UserInput zu stoppen? Also möchte während nen Timer im Thread läuft, nicht das der User in der Menübar rumspielen kann. Ist das möglich?



  • Eine Frage hätte ich noch. Ich hab nen Dialog erstellt. Dann ein wxStaticBoxSizerH erstellt und darin eine einzeilige Textbox. Links daneben einen wxStaticText gesetzt. Nun wollte ich im wxStaticBoxSizer noch eine weitere einzeilige Textbox UNTER die vorherige setzen und nicht daneben. Sprich Vertical und nicht Horizontal. Wie mache ich das? Möchte keinen neuen wxStaticBoxSizer benutzen, sollen beide Textboxen untereinander im StaticBoxSizer sein.

    Danke.



  • Die beiden Eingabefelder in einen V-Sizer.
    Diesen V-Sizer und der linke Text in eine H-Sizer.



  • Danke! Habs jetzt hinbekommen. 🙂


Anmelden zum Antworten