memory dc will nicht funktionieren
-
ich versuche über einen memory dc flimmerfrei auf den dc meines controls (von CWnd abgeleitet) zu zeichnen:
void CMyClass::OnPaint() { CRect rRect; CClientDC cClientDC(this); CDC dMemDC; dMemDC.CreateCompatibleDC(&cClientDC); GetClientRect(rRect); dMemDC.FillSolidRect(rRect, RGB(200,0,0)); cClientDC.BitBlt(0, 0, rRect.Width(), rRect.Height(), &dMemDC, 0, 0, SRCCOPY); }aber es tut sich nichts. vermute es liegt an mir ^^
-
In der Behandlungsroutine für die WM_PAINT Botschaft ( CWnd::OnPaint() ) solltest du mit einem CPaintDC arbeiten und nicht mit einem CClientDC, damit BeginPaint und EndPaint korrekt aufgerufen werden.
void CMyClass::OnPaint() { CRect rRect; CPaintDC cClientDC(this); CDC dMemDC; //-- Rest of the code }
-
mit dem CPaintDC klappts nicht. hatte das mit dem ClientDC zum testen gemacht.
hast du vielleicht noch eine andere idee?
-
Ich empfehle dir einfach das folgende zu nehmen und bei dir zu implementieren:
http://www.codeproject.com/gdi/flickerfree.aspIst alles vorgefertigt und schön beschrieben und funktioniert!
Grüssli
-
Ein DC hat standardmässig eine 1x1 pixel Bitmap selektiert. In der zeichnest du zur Zeit rum.
Da musst du noch eine Bitmap erstellen, diese in den MemDC selektieren, in dieser zeichnen und dann das Ergebnis blitten.
Etwa wie folgt: ( Mal ohne richtiges Fehlerhandling )
void CMyClass::OnPaint() { CRect rRect; CPaintDC cClientDC(this); CDC dMemDC; GetClientRect(rRect); dMemDC.CreateCompatibleDC(&cClientDC); CBitmap bmp; bmp.CreateCompatibleBitmap( &cClientDC, rRect.Width(), rRect.Height() ); CBitmap* oldbmp = dMemDC.SelectObject( &bmp ); dMemDC.FillSolidRect(rRect, RGB(200,0,0)); cClientDC.BitBlt(0, 0, rRect.Width(), rRect.Height(), &dMemDC, 0, 0, SRCCOPY); dMemDC.SelectObject( oldbmp ); bmp.DeleteObject(); }
-
asooo ist das. jetzt ist mir alles klar !! danke euch.
@Dravere: das sample ist glaube ich richtig gut !! probiere es später aus