?
Hallo da!
Da ich mit der Windows API jetzt in meinem View ein bisschen rumzeichnen muss und das "möglichst" (also mit vertretbarem Aufwand) effizient und ohne Flackern machen möchte, habe ich im Internet ein bisschen nach Double-Buffering mit Gdi+ geschaut. Dies ist nun mein zwischenzeitliches Ergebnis:
CRect drawRect;
pDC->GetClipBox( drawRect );
Gdiplus::Bitmap buffer(drawRect.Width(), drawRect.Height());
{
Gdiplus::Graphics* g = Gdiplus::Graphics::FromImage( &buffer );
g->TranslateTransform( -drawRect.left, -drawRect.top );
g->Clear( Gdiplus::Color( 255, 255, 255, 255 ) );
for( unsigned int i=0; i<objects.size(); ++i ) {
objects[i]->draw( *g );
}
delete g;
}
Gdiplus::Graphics g( pDC->m_hDC );
g.DrawImage( &buffer, drawRect.left, drawRect.top );
Durch passende Bounding-Box-Behandlung versuche ich die Box in InvalidateRect möglichst klein zu halten, bevor ich UpdateWindow(rect, FALSE); aufrufe. Außerdem überprüfen die Objekte vorm Zeichnen mit IsVisible, ob sie überhaupt in dem ungeclipten Bereich liegen. Nun stellt sich mir aber die Frage, ob man die Bitmap nicht so erstellen kann, dass g.DrawImage auf ein "memcpy" hinausläuft. Zu Zeiten von normaler GDI gab es ja auch den CreateCompatible-Kram. Hat die Bitmap ohne besondere Parameter immer das Format des Bildschirmpuffers? Für alle Vorschläge um das noch weiter zu optimieren wäre ich sehr dankbar. Ich könnte mir vorstellen, dass es eventuell noch effizienter wäre, die Bitmap nach jeder Größen-Änderung des Fensters einmal zu erstellen und dann solange zu benutzen, bis das Fenster seine Größe wieder verändert. Aber ist natürlich auch eine Speicherfrage.
Viele Grüße,
Michael