BitBlt nur mit Bitmaps?
-
Hallo zusammen,
Ich würde gerne den View meiner SDI Anwendung Backbuffern. Wenn ich das ganze bei Bitmaps mache, funktioniert es tadellos aber ich Zeichne ne ganze Menge mit CDC::FrameRect, CDC::FillRect und CDC:TextOut. Diese sachen werden leider nicht Dargestellet.
Kann mir jemand einen Tip geben wie auch das Backbuffern kann, um das Flackern zu reduzieren?
Besten Dank!
Gruß,
mathi
-
Du könntest das ganze Fenster als Bitmap puffern.
CDC *pDc = GetDC(); RECT rc; GetClientRect(&rc); m_dcMem.CreateCompatibleBitmap(pDc,rc.right,rc.bottom); m_dcMem.SelectObject(&m_bitmap); m_bitmap.CreateBitmap(...) // m_bitmap und m_dcMem müßen globale Gülitigkeit besitzen m_dcMem.BitBlt(0,0,rc.right,rc.bottom,pDc,0,0,SRCCOPY);Muß aber wirklich sein, das die Anwendung gepuffert wird. Das Flickern kann auch, wenn man nur zeichnet "wenn es sein muß", unterdrückt werden.
-
Fragen siehe Komentare:
CDC *pDc = GetDC(); RECT rc; GetClientRect(&rc); m_dcMem.CreateCompatibleBitmap(pDc,rc.right,rc.bottom); m_dcMem.SelectObject(&m_bitmap); // Das Bitmap wir in den DC geladen, also muss ich doch vorher in das Bitmap gezeichnet haben? m_bitmap.CreateBitmap(...) // Wieso? m_dcMem.BitBlt(0,0,rc.right,rc.bottom,pDc,0,0,SRCCOPY); // Sollte hier nicht pDC stehen?Oder anders gefragt: Kannst du das bitte etwas genauer erkären? z.B. wo zeichne ich denn nun rein mit meinen FrameRect und TextOut Funktion.
Das Flickern kann auch, wenn man nur zeichnet "wenn es sein muß", unterdrückt werden.
Und wie?
Sorry, wenn ich micht etwas blöd anstelle, aber wie man ein Bitmap buffert weiss ich ja eigentlich. Blos bei den anderen DC-Funktionen komme ich nicht klar.
Gruß,
mathi
-
Hierbei wird aber der ganze Fensterinhalt als Bitmap gepuffert, also auch was Du mit "TextOut" geschrieben hast.
Man kann doch auch die Daten nur aktualisieren, wenn sich auch was ändert und auch nur die Daten, die in dem Bereich sind, der gezeichnet werden muß.
-
Der oben geschriebene Code ist nicht "ganz" fehlerfrei. Das Prinzip ist aber, daß der Fensterinhalt, der in "pDC" ist in "m_dcMem" kopiert wird, wo vorher ein Bitmap erzeugt wurde. Dieses Bitmap kann dann in den Device-Kontext der Anwendung zurück geschrieben werden.
-
Sorry ich packs net!
Also ich habe die OnDraw(CDC* pDC) meiner View-Klasse und dort rufe ich die Draw-Funktion des darzustellenden Objectes auf. Was und wie muss ich jetzt drumrum basteln?CMyView::OnDraw(CDC* pDC) { // ...? <object>.Draw(pDC); // ...? SetScrollSizes(...); CFrameWnd *pParentFrame = (CFrameWnd *)this->GetParentFrame(); pParentFrame->RecalcLayout(); }
-
Verwendest Du die Klasse "CScrollView", diese "macht" ein flickerfreies Scrollen. Jetzt habe ich erst Dein Problem verstanden.

-
Ich verwende zwar den ScrollView, allerdings habe ich Bereiche in dem View, die nicht gescrollt werden dürfen. Und genau an der Stelle scheitere ich, die bereiche flackern ohne ende. Im Moment bastel ich mir separate Fenster für die Anzeigen, die nicht gescrollt werden sollen, allerdings ist das nicht besonders zufriedenstellend.
Also es wäre nett, wenn du mir das Backbuffering nochmal genauer "programmieren ;-)" könntest, sofern das mit dem scrollview überhaupt zu machen ist.
Gruß,
mathi
-
Was heißt "nicht gescrollt werden dürfen"? Wird nicht das ganze Material aus "OnDraw" gescrollt?
-
Das Prinzip der Backpufferung ist:
//nachdem die Daten aktualisiert wurden... CDC *pDC; RECT rc; pDC = pView->GetDC(); m_dcMem = CreateCompatibleDC(pDC); pView->GetClientRect(&rc); m_bitmap.CreateCompatibleBitmap(&m_dcMem,rc.right,rc.bottom); m_dcMem.SelectObject(&m_bitmap); m_dcMem.BitBlt(0,0,rc.right,rc.bottom,pDc,0,0,SRCCOPY); //Jetzt hast Du ein Bitmap von dem View, daß Du zurückschreiben kannst //In "OnDraw"... pDC->BitBlt(0,0,rc.right,rc.bottom,&m_dc,0,0,SRCCOPY);Ich hoffe jetzt hast Du das Prinzip verstanden.
-
Also ich denke das Prinzip habe ich verstanden: "ins Bitmap zeichnen und dann zurückkopieren" Aber ausser exceptions bekomme ich nix hin.

Was heißt "nicht gescrollt werden dürfen"?
Das hat sich inzwischen erledigt. Wäre ja auch ein bischen blöd nen scrollview zu benutzen und beim scrollen wieder das Scrollen herausrechnen

Ich mach das jetzt mit extra Fenstern.
Deshalb ist das mit dem Backbuffer auch nicht mehr so extrem akut. Hatte bloss auf einem etwas langsameren rechner ein deutliches "Bildlaufen" beim scrollen bemerkt"
Also thx erstmal!
Gruß,
moskito