Thread für Bildbewegung auf der Form?



  • Hallo,
    ich bin am verzweifeln. Ich möchte ein Bild über mein Form wandern lassen. Dazu brauche ich Daten, welche die Position bestimmen.
    Ich übergebe das Dialogfeld an den Thread und rufe dann folgende Methode auf:

    dlg->Invalidate  (false);  
    
    dlg->OnPaint();//funktioniert nur für die Steuerelemente alleine, 
                    //nicht für das Bild
    
    dlg->UpdateData (true);
    

    Nach ca. 20 -30s flackern alle aktiven Fenster in Windows. Woran kann das liegen?
    Allein die Methode dlg->OnPaint(); funktioniert für die Textfelder, welche aktualisiert werden, aber nicht für das Bild.



  • Invalidate(FALSE) sollte eigenltich reichen, solange du in der OnPaint deine Zeichenroutine hast. D.h. du solltest immer in der OnPaint zeichnen. Damit werden dann auch Bilder neu gezeichnet.


  • Mod

    Man sollte niemals OnPaint direkt aufrufen. Für so etwas gibt es InvalidateRect, UpdateWindow, RedrawWindow!

    Und weiterhin solltest Du diese UI Funktionen niemals aus einem anderen Thread benutzen!



  • ok, also mit invalidate(false) tritt der Fehler nach ca. 20 s auf. Vielleicht sollte ich das Bitmap vorher laden und nicht in onPaint. Das kostet vielleicht Zeit. Ansonsten habe ich keine Idee mehr.

    Wie sollte ich etwas im Formular bewegen und verändern ohne die UI-Funktionen?



  • wie genau zeichnest du denn dein Bild? Und woher kommt es?



  • // Tube-Bild laden
    CBitmap BmpSeil, *pOldBmp;
    CDC BmpDc;
      BmpSeil.LoadBitmap(IDB_SEIL);
    VERIFY( BmpDc.CreateCompatibleDC(&dc) );
    pOldBmp = (CBitmap *)BmpDc.SelectObject(&BkBmp);
    dc.BitBlt(20,30,696,15,&BmpDc,0,0,SRCCOPY);
    BmpDc.SelectObject(pOldBmp); 
    
    CBitmap BkBmp, *pOldSeil;
    CDC BmpDcSeil;
    // Seil-Bild laden
    BkBmp.LoadBitmap(IDB_TUBE);
    VERIFY( BmpDcSeil.CreateCompatibleDC(&dc) );
    pOldSeil = (CBitmap *)BmpDcSeil.SelectObject(&BmpSeil);
    dc.BitBlt(xSeil, ySeil, 789, 10,&BmpDcSeil,0,0,SRCCOPY);
    BmpDcSeil.SelectObject(pOldSeil);
    

    Außerdem werden noch ca. 20 Textfelder aktualisiert.


Log in to reply