TImage nach FormResize neuzeichnen



  • Simple Frage aber ich komm nicht drauf:
    Wie kann ich nach dem Resize ein Image neuzeichnen?
    (Da meine Neuberechnung zu lange dauert möchte ich das Image während dem Resize löschen und im Anschluss neuzeichnen)

    Danke!



  • Ich verstehe das Problem nicht. Was soll wann womit passieren?



  • wenn ich die größe des formular mit der mouse ändere wird immer resize aufgerufen. aufwändigere funktionen möchte ich erst nach dem resize ausführen...

    vielleicht OnMouseUp abfragen ob gerade ein resize ausgeführt wurde?



  • Ah, jetzt verstehe ich. Während der Größenänderung wird mehrmals OnResize aufgerufen, und das löst ein Neuzeichnen des Bildes aus. Und das dauert jedes Mal lange und dadurch wird deine Anwendung träge?
    Ein wirklich saubere Lösung gibt´s da nicht, du kannst vielleicht einen Timer aufziehen und im Handler prüfen, ob das Bild neu gezeichnet werden muss. Über das Intervall des Timers kannst du die Aktualisierungsgeschwindigkeit bestimmen.

    class TMyForm : public TForm
    {
       ...
    private:
       bool ImageDirty_;
       ...
    };
    
    void TMyForm::OnFormResize( TObject* Sender )
    {
       // Timer starten, falls er inaktiv ist
       if( !Timer->Enabled )
       {
          Timer->Enabled = true;
       }
       // Flag zum Neuzeichnen des Bildes setzen
       ImageDirty_ = true;
    }
    
    void TMyForm::OnTimer( TObject* Sender )
    {
       if( ImageDirty_ ) 
       {
          // Bild muss neu gezeichnet werden
          repaint_image();
          ImageDirty_ = false;
       }
       else
       {
          // Timer ist abgelaufen und das Bild muss nicht
          // neu gezeichnet werden => kein weiteres Resize
          // Timer wird nicht mehr benötigt -> deaktivieren
          // Timer->Enabled = false;
       }
    }
    

    Nachtrag:
    Du kannst auch den Status der linken Maustaste prüfen, wenn sie unten ist wird vermutlich die Größe weiter verändert. Das könnte auch klappen.

    void TMyForm::OnFormResize( TObject* Sender )
    {
       if( (GetAsyncKeyState( VK_LBUTTON ) & 0x8000) == 0 )
       {
          // Bild neu zeichnen
       }
    }
    


  • Ich würde in OnResize den Timer immer wieder neu aufziehen, dann werden deine Berechnungen erst dann ausgeführt, wenn sich das System wieder "beruhigt" hat:

    void TMyForm::OnFormResize( TObject* Sender )
    {
       Timer->Enabled = false;
       Timer->Enabled = true;
    }
    void TMyForm::OnTimer( TObject* Sender )
    {   
       Timer->Enabled = false;
       repaint_image();
    }
    

    😉



  • Timer kannte ich gar nicht, klingt vernünftig.

    Danke Euch!


Anmelden zum Antworten