bewegter Ball
-
Hallo,
ich habe folgendes Problem:
Ich möchte einen Ball (Kreis) durch ein SDI-Fensetr laufen lassen! Dazu rufe ich mittels einen Threads folgende Funktion auf:BOOL CLaufenderBallView::laufen() { CDC *pDC=GetDC(); CRect Temp; pDC->SetMapMode(MM_HIMETRIC); pDC->SetViewportOrg(0,ClientRect.bottom); while (bLaufen) { Kreis.OffsetRect(tempo_hori,tempo_vert); if (Kreis.bottom>ClientRect_log.top) tempo_vert=-tempo_vert; if (Kreis.top<ClientRect_log.bottom) tempo_vert=-tempo_vert; if (Kreis.right>ClientRect_log.right) tempo_hori=-tempo_hori; if (Kreis.left<ClientRect_log.left) tempo_hori=-tempo_hori; pDC->Ellipse(Kreis); } ReleaseDC(pDC); return true; }
Der Kreis wird auch fortlaufend gezeichnet, nur nicht so wie ich wirklich will! Und zwar wird hier der gesamte Bildschirm mit Kreisen zugemalt! Ich wollte aber nur einen bewegten Kreis!
Ich habe schon versucht, durch Löschen des Bildschirms mitInvalidateRect(Kreis)
gleich am Anfang der Schleife das Problem zu lösen! Nur flackert nun die ganze Anzeige!
Kennt jemand noch ne andere Möglichkeit?Danke
-
Merke dir einfach die Kordinaten des zuletzt gezeichneten Kreises und zeichne dort den Kreis in der Hintergrundfarbe
BOOL CLaufenderBallView::laufen() { CDC *pDC=GetDC(); CRect Temp, oldrect ( -1, -1, -1, -1 ); COLORREF background = GetSysColor ( COLOR_WINDOW ); CPen bpen ( PS_SOLID, 1, background ); CBrush bbrush; bbrush.CreateSolidBrush ( background ); pDC->SetMapMode(MM_HIMETRIC); pDC->SetViewportOrg(0,ClientRect.bottom); while (bLaufen) { if (( oldrect.left > -1 ) && ( oldrect.top > -1 )) { CPen *oldpen = pDC->SelectObject ( &bpen ); CBrush *oldbrush = pDC->SelectObject ( &bbrush); pDC->Ellipse(oldrect); pDC->SelectObject ( &bpen ); pDC->SelectObject ( &oldbrush ); } Kreis.OffsetRect(tempo_hori,tempo_vert); if (Kreis.bottom>ClientRect_log.top) tempo_vert=-tempo_vert; if (Kreis.top<ClientRect_log.bottom) tempo_vert=-tempo_vert; if (Kreis.right>ClientRect_log.right) tempo_hori=-tempo_hori; if (Kreis.left<ClientRect_log.left) tempo_hori=-tempo_hori; pDC->Ellipse(Kreis); oldrect = Kreis; } ReleaseDC(pDC); return true; }
-
Danke AndySchock69,
aber was du machst, ist doch fast das Gleiche, als wenn ich ein
InvalidateRect(Kreis)
an der Stelle einfüge, wo du den alten Kreis mit der Hintergrundfarbe neu zeichnest! Das flimmern bleibt nämlich!
Hast du, oder jemand anderes, noch ne Idee?
-
Hallo,
aber bei
InvalidateRect ( Kreis );
wir dir WM_PAINT gesendet und dadurch OnPaint aufgerufen
aber du könntest es mal statt mit
GetDC ()
mit
CClientDC dc ( this ); //oder CPaintDC dc ( this ); //probieren
könnte helfen
-
Wie schnell bewegt sich eigentlich dein Kreis?
Versuche es mal nachpDC->Ellipse(Kreis); Sleep ( 100 );
dann dürfte es nicht mehr flimmern