Ich benötige Hilfe beim Zeichnen auf ein Panel



  • Ich habe einen eindimensionalen Zellulären Automaten mit wxWidgets geschrieben. Bei dem Versuch die Anzeige auf ein Panel zu zeichnen tritt allerdings ein störendes Flackern auf.
    Ich habe es sowohl mit wxPaintDC als auch mit wxBufferedPaintDC versucht, was aber beides nicht den gewünschten Erfolg hatte.
    Meine momentane Lösung reduziert das Flackern auf ein Minimum.

    void myPanel::OnPaint(wxPaintEvent& event) {
        wxBitmap bit(this->GetSize().GetWidth(), this->GetSize().GetHeight());
        wxMemoryDC dc;
        dc.SelectObject(bit);
    
        dc.SetBackground(*BACKGROUND);
        dc.Clear();
    
        wxPen gitterPen = *wxBLACK_PEN;
        gitterPen.SetStyle(wxSOLID);
        gitterPen.SetWidth(1);
        dc.SetPen(gitterPen);
    
        for (int i = 0; i < ((MainFrame*) Parent)->FirstSize; i++) {
            for (int j = 0; j < ((MainFrame*) Parent)->SecondSize; j++)
                if (((MainFrame*) Parent)->Cells[i][j] == 2) {
                    dc.DrawPoint(j, i);
                }
        }
    
        wxBufferedPaintDC bdc(this);
        bdc.Blit(0, 0, this->GetSize().GetWidth(), this->GetSize().GetHeight(), &dc, 0, 0);
    }
    

    Gibt es einen Weg das Flackern ganz zu unterbinden?

    MfG
    SebSonn++

    Sprache: C++
    Betriebssystem: WindowsXP
    IDE: NetBeans
    wxWidgets: wxPack2.8



  • PS: Ich verwende eine Klasse myPanel welche ich von wxPanel ableite.



  • 1. wxDC-Operationen sind extrem platform-spezifisch.
    Existiert beispielsweise eine elementare Funktion auf der Platform nicht, wird eine generische Implementierung verwendent, die natürlich sehr langsam sein kann.

    Bei Win32 empfiehlt es sich GDI zu aktivieren siehe -> setup.h

    2. Versuche die wx-Mechanismen zu verstehen.
    wxBuffered + Blitting geht in die richtige Richtung.
    Wenn du die Möglichkeit hast zu profilen, schau mal ob er über 80% der CPU-Last beim Blitten verbraucht.


  • Mod

    wxBufferedPaintDC braucht einen bestimmten Modi oder Style den du vorher setzen musst, steht aber alles in der Doku.



  • Ja, der Style war es gewesen

    SetBackgroundStyle(wxBG_STYLE_CUSTOM);
    

    ein herzliches Dankeschön ans Forum
    Mfg
    SebSonn++


Anmelden zum Antworten