Warum flimmert es? :-(



  • Hallo,

    ich hab ein Programm bei dem ich im Hauptfenster bei jedem Mausmove ein Rechteck an verschiedene Positionen schieben will, je nachdem wo sich der Mousecursor grade befindet.
    Ich machs bisher so:

    in mousemove: Koordinaten setzten, Invalidate Rect aufrufen für die bereiche die nicht mehr gültig sind.

    in ondraw: Zeichnen des Bildes und des neupositionierten Rechtecks.

    Aber leider flimmert das ganze wie der Wahnsinn 😞 und irgendwann wird sogar ne unaufgefangene Exception ausgelöst und das Fenster bleibt nur noch weiss 😕 .

    Was muß ich denn ändern damit es nicht mehr flimmert?



  • hi!
    Daran ist InvalidteRrct schuld. ließ dein Rechteck einfach in dein Speicer ein.
    Erstell einfach eine Membervariable CDC* und mit PatBlt solltete es fuzten
    mfg *mike* 😃



  • Ich hab das gleiche Problem, nur das bei mir über den Bildschirm verstreut mehrere Teile neu gezeichnet werden müssen.
    Weiß jemand wie man da das flimmern herausbekommt ?



  • Rechtsklick auf den Desktop -> Eigenschaften -> Effekte -> Disable Fensterinhalt beim Ziehen anzeigen 😉

    [ Dieser Beitrag wurde am 24.09.2002 um 08:12 Uhr von toosten editiert. ]



  • Ihr dürft nicht direkt auf den Bildschirm zeichnen.
    Ich geb euch mal nen CodeSchnipsel:

    void CCBTestView::OnDraw(CDC* pDC)
    {
        CCBTestDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
    
        RECT r;
        CDC memDC;
        CBitmap bmp;
        CBitmap* bmpOld;
    
        GetClientRect(&r);
    
        memDC.CreateCompatibleDC(pDC);
        bmp.CreateCompatibleBitmap(pDC,r.right,r.bottom);
        bmpOld=memDC.SelectObject(&bmp);
    
        {
            RECT r2(r);
            --r2.left;
            ++r2.right;
            --r2.top;
            ++r2.bottom;
            memDC.Rectangle(&r2);
        }
    
        // Hier in das memDC reinzeichnen
        CPetrinetView::OnDraw(&memDC);
    
        pDC->BitBlt(0,0,r.right,r.bottom,&memDC,0,0,SRCCOPY);
        memDC.SelectObject(bmpOld);
    }
    
    BOOL CCBTestView::OnEraseBkgnd(CDC* pDC) 
    {
        // TODO: Add your message handler code here and/or call default
    
        return true;
        //return CPetrinetView::OnEraseBkgnd(pDC);
    }
    


  • Hi Nemesyzz,
    Dein Code funzt supa.
    Wie läuft das ganze aber bei einer dialogfeldbasierten Anwendung ?



  • Da kommt der Code einfach in die OnPaint funktion.

    Beispiel(einfügen eines Hintergrundbildes):

    void CGameDlg::OnPaint() 
    { 
      CPaintDC dc(this); 
      CPaintDC* pDC = &dc; 
    
      BITMAP bmBackground;                                
      bmBackground.GetObject(sizeof(bmBackground),&bmBackground); //Größe und Adresse von Hintergrund --> BITMAP bm 
    
      CDC memDC; 
      memDC.CreateCompatibleDC(pDC);    //SpeicherDC initialisieren 
      memDC.SelectObject(&Bild[0]);     //Hintergrundbild --> Speicher 
    
      RECT Rect; 
      GetClientRect(&Rect); 
      pDC->StretchBlt(0,0,Rect.right,Rect.bottom,&memDC,0,0, 
                      bmBackground.bmWidth,bmBackground.bmHeight,SRCCOPY); 
    
      CDialog::OnPaint(); 
    }
    

    damit sollte es funktionieren.

    ndT Wolf


Anmelden zum Antworten