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 mit

    InvalidateRect(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 nach

    pDC->Ellipse(Kreis);
    Sleep ( 100 );
    

    dann dürfte es nicht mehr flimmern


Anmelden zum Antworten