Bitmap Double Buffern, aber wie?
-
Hallo Leute,
ich habe es endlich geschafft auf meinem MDI Hintergrund zu malen. So jetzt habe ich da ein Bitmap drauf, das immer in der Mitte der Anwedung sein soll. Problem ist das es recht klein ist und nicht gestrecht werden darf. Also habe ich den den pDC immer erst mit FillRect weiß gemalt und dann das Bitmap eingefügt. Allerdings sieht man diesen Flackereffekt enorm. Habe mich schon ein wenig in das Double Buffern eingelesen, aber kriege es einfach nicht hin.Hier mal mein Code, wie es bisher funktioniert.
CNewCleintWnd::CNewCleintWnd() { m_MyBitmap.LoadBitmap(IDB_BITMAP4); } CNewCleintWnd::~CNewCleintWnd() { } BOOL CNewCleintWnd::OnEraseBkgnd(CDC* pDC) { int bx, by; CRect rect; GetClientRect(&rect); CBrush backBrush(RGB(255,255,255)); //auslesen der Größe (x,y) des Bitmaps in bm BITMAP bm; m_MyBitmap.GetObject(sizeof(bm), &bm); //bestimmen der Mittelposition des Fensters anhand der Bitmap größe if((bx=rect.right/2-bm.bmWidth/2)<0) bx=0; if ((by=rect.bottom/2-bm.bmHeight/2)<0) by=0; CDC speicherDC, transferDC; speicherDC.CreateCompatibleDC(pDC); CBitmap* pOldBitmap = speicherDC.SelectObject(&m_MyBitmap); pDC->FillRect(rect,&backBrush); pDC->BitBlt(bx, by, bm.bmWidth, bm.bmHeight,&speicherDC, 0, 0, SRCCOPY); speicherDC.SelectObject(pOldBitmap); return TRUE; } void CNewCleintWnd::OnSize(UINT nType, int cx, int cy) { this->OnEraseBkgnd(GetDC()); }Meine Idee war es einfach einen 2. CDC einzufügen, den ich weiß mache, dann das Bitmap an der richtigen Stelle einfüge und dann den gesamten Inhalt in den pDC zurückschreibe. Allerdings weiß ich nicht wie ich den 2. CDC in den pDC zurückschreibe?
Bitte um eure Hilfe.
DankeGruß
Groove
-
Zum Thema Double-Buffering kann ich nichts sagen.
Wohl aber wie du das Flackern evtl. unterdrücken kannst.Du solltest dein Bild in OnPaint zeichnen.
In OnEraseBkgnd verhinderst du, dass dieser Bereich (in den du das Bild gezeichnet hast) gelöscht wird.Siehe http://www.codeguru.com/cpp/controls/controls/article.php/c2297/
edit:
Vermutung:
Du solltest in OnPaint alles neu Zeichnen und in OnEraseBkgnd den kompletten Client Bereich deines Fensters neu Zeichnen.
(sonst gibt es wohl unschöne Effekte: es wird ja nur ein kleiner Bereich neu gezeichnet)
Verhinderst du das Löschen des Hintergrunds (in OnEraseBkgnd) sollte das flackern nicht mehr auftreten.
-
Danke für deine Antwort. Ich habe das Flackern aber nur beim resizen des Fensters und dann soll der Background ja gelöscht werden, damit das Bild bei der neu eingestellten Größe auch in der Mitte sitzt.
Einzig wird bei mir in 2. Schritten gelöscht, erst weiß übermalt und dann das bitmap neu drauf geklatscht. Und das soll jetzt als ein einziger Schritt abgearbeitet werden.Gruß
Groove
-
Im Parent WS_CLIPCHILDREN verwenden!
-
GrooveXT schrieb:
Danke für deine Antwort. Ich habe das Flackern aber nur beim resizen des Fensters und dann soll der Background ja gelöscht werden, damit das Bild bei der neu eingestellten Größe auch in der Mitte sitzt.
Einzig wird bei mir in 2. Schritten gelöscht, erst weiß übermalt und dann das bitmap neu drauf geklatscht. Und das soll jetzt als ein einziger Schritt abgearbeitet werden.Gruß
GrooveIch habe meinen ersten Beitrag nochmal aktualisiert. Das Unterdrücken von OnEraseBkgnd sollte helfen.
Du zeichnest ja den Bereich komplett neu.
-
Also ich habe es ausprobiert. Es macht keinen Unterschied ob ich in OnPaint oder EraseBkgrnd zeichne, das Flackern bleibt so oder so.
Ich denke wirklich das nur das zeichnen im Buffer helfen würde, aber das will nicht funktionieren.
-
In OnPaint zeichnen und in EraseBkgrnd verhindern, dass der Hintergrund gelöscht wird.
Schau dir bitte mal
http://www.codeguru.com/cpp/controls/controls/article.php/c2297/
an.Das Flackern kommt dadurch, dass du z.B. einen schwarzen Hintergrund zeichnest. Bevor der gezeichnet wird, wird der Hintergrund in EraseBkgrnd gelöscht (z.B. Weiß). Das ist das Standard Verhalten.
Martin Richter wollte dir auch etwas mitteilen. Verfolg das doch mal weiter.