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.
-
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++