Fenster wirklich neu zeichnen



  • @Martin-Richter
    Ja, ich wollte ja das Neuzeichnen erzwingen.
    Aber was läuft dann schief?

    Ich muss noch Einiges Überdenken.

    Danke jedenfalls erstmal Euch allen



  • Wie schon geschrieben, mußt du das Neuzeichnen außerhalb des Zeichenvorgangs anstoßen.

    Für das Löschen des Hintergrunds ist normalerweise die Nachricht WM_ERASEBKGND zuständig. Kannst ja mal schauen, ob dies in eurem Projekt verwendet wird (falls nicht, sollte es automatisch so funktionieren) - evtl. auch mal den Parameter fErase (wie im Link beschrieben) überprüfen.



  • @Martin-Richter @Th69 @DocShoe
    Danke für Eure Hilfe und für den Beispielcode.
    Habe wieder was dazugelernt.

    Ich habe jetzt jedenfalls verstanden und akzeptiert, dass das "Invalidate.."-Zeug nicht in diese "Draw()" oder "OnDraw()" Funktionen gehört.
    Vor drei Wochen, als ich das implementiert habe, war zumindest mein Eindruck, dass das "Invalidate" eine Aktion ausgelöst hatte.
    Nun scheint es das nichtmehr zu tun. Wie auch immer ... vielleicht nicht alle Fälle getestet ....

    Inzwischen habe ich auch herausgefunden, dass, auch ohne "Invalidate", etc., ein Neuzeichnen stattfindet.
    Somit lag der Fehler in meinem Algorithmus, der in einem bestimmten Fall die erste Zeile falsch berechnete.

    Also vielen Dank nochmals an alle.



  • @elmut19

    Ja, man muss verstehen, wie Windows intern Fenster und deren Zustände verwaltet (die MFC ist auch nur ein Wrapper um die WINAPI). Das Neuzeichnen passiert nur auf eine Reaktion auf eine WM_PAINT Nachricht, und da gibt es verschiedene Möglichkeiten, diese Nachricht an ein Fenster zu schicken:

    • Kombination aus InvalidateRect und UpdateWindow: Mit InvalidateRect werden Teile des Fenster als ungültig markiert, UpdateWindow fasst die ungültigen Bereiche zusammen und schickt die WM_PAINT Nachricht an das Fenster. Es wird nicht auf die Bearbeitung der WM_PAINT Nachricht gewartet, das Programm läuft nach UpdateWindow weiter, ohne dass neu gezeichnet worden ist. Das Neuzeichnen passiert dann irgendwann, wenn kein User Code mehr ausgeführt wird und das Fenster seine Nachrichten behandeln kann.
    • RedrawWindow löst ebenfalls eine WM_PAINT Nachricht aus, kehrt aber erst dann zurück, wenn das Fenster tatsächlich neu gezeichnet worden ist.

    Kennst du dich mit dem Mechanismus der Windows Message Pump aus? Das solltest du verstanden haben, wenn du für Windows programmierst.



  • @DocShoe
    Wer kennt das Messaging schon komplett.
    Natürlich arbeite ich immer wieder mal mit SendMessage oder PostMessage.
    Bei einigen Automatismen bin ich natürlich nicht immer sicher.



  • @elmut19 sagte in Fenster wirklich neu zeichnen:

    Wer kennt das Messaging schon komplett.

    Die KI kann so etwas bestens.


Anmelden zum Antworten