RedrawWindow() bestimmte Area?



  • Nun, ich habe das Problem, dass ich nur einen bestimmten Ausschnitt des Fensters neuzeichnen will und nicht das ganze Fenster.
    Dies soll mit RedrawWindow gehen.
    In der MDSN stehen die Parameter ja auch vorhanden,

    BOOL RedrawWindow(
      HWND hWnd,        // handle of window
      CONST RECT *lprcUpdate,
                        // address of structure with update rectangle
      HRGN hrgnUpdate,  // handle of update region
      UINT flags        // array of redraw flags
    );
    

    aber ich werde daraus einfach nicht schlau, vor allem, weil Google massenweise beispiele ausspuckt, die alle nicht funktionieren wollen.
    Hat jemand vielelihct einen Beispielcode für die beiden Parameter, vor allem wie sie genutzt werden?

    CONST RECT *lprcUpdate, // address of structure with update rectangle
    HRGN hrgnUpdate, // handle of update region

    Vielen Dank



  • Du solltest der Struktur entweder ein gültiges Rechteck übergeben, das neu gezeichnet werden soll, oder aber eine Region. Nimm in deinem Fall am besten erstmal das Rechteck.
    Rest ist ja eigentlich einfach:

    RECT rctUpdate = { 10, 10, 50, 50 };
    RedrawWindow( hWnd, &rctUpdate, NULL, RDW_UPDATENOW );
    

    Bei den Flags bin ich mir nicht sicher, musst du evtl ein bisschen rumspielen, aber was funktioniert denn daran nicht?



  • Ähm...und wie ist es einfach mit:

    RECT rcUpdate {...};
    InvalidateRect(hWnd, &rcUpdate, TRUE);
    


  • Also, das Problem hatte ich damit, dass ich:
    1. Überlesen hatte, dass nur EINS von beidem angegeben werden darf.
    2. dass die RECT-Struktur die Werte von linker oberer und rechter unterer Ecke haben möchte und nciht etwa linke obere Ecke und x-Width und y-Width.
    Das waren mein beiden Fehler.

    Vielen dank für eure Hilfe, die wie immer seeehr schnell kam 🙂


  • Mod

    @CodeFinder: InvalidateRect macht eben nur den Invalidate. RedrawWindow ist ein kombiniertes InvalidateRect/UpdateWindow!



  • Martin Richter schrieb:

    @CodeFinder: InvalidateRect macht eben nur den Invalidate. RedrawWindow ist ein kombiniertes InvalidateRect/UpdateWindow!

    Aber aus einem invaliden Rechteck folgt ein geupdatetes Rechkeck 😃 .
    UpdateWindow sollte man sowieso nur dann verwenden, wenn WIRKLICH notwendig, wegen der hohen Priorität der Nachrichten.


  • Mod

    Naja. Manchmal, wenn viele Fenster zu Upatensind, wünscht man sich manchmal auf bestimte Operationen ein sofortiges Update. Besonders nach Tastatur Operationen. Da macht RedrawWindow schon sinn.
    Auch wenn z.B. die Message Loop nicht läuft und man dennoch einen Fortschritt anzeigen möchte.

    Aber korrekt, normalerweise (in 99,9%) der Fälle ist hier nichts notwendig.



  • Genau, so ist es bei mir auch:
    Das RedrawWindow bezieht sich auf einen Ladebalken, dessen Änderungen in einem eigenem Thread stattfinden und unabhängig von der MessageLoop sind, da der Prozess auch bei minimiertem fenster ablaufen soll.
    damit wäre eigentlich alles geklärt 😃


  • Mod

    Redraw schrieb:

    Genau, so ist es bei mir auch:
    Das RedrawWindow bezieht sich auf einen Ladebalken, dessen Änderungen in einem eigenem Thread stattfinden und unabhängig von der MessageLoop sind, da der Prozess auch bei minimiertem fenster ablaufen soll.
    damit wäre eigentlich alles geklärt 😃

    Nein! Wenn ich dich recht verstehe, willst Du ReaddrawWindow auf ein Fenster in einem anderen Thread ausführen! Das kann aberzu massiven Problemen führen, denn dadurch erfolgt bei gesetztem Update Bit eine Threadsynchronisation. Nur wenn auch die Message Loop im Fensterthread ausgeführt wird, dann wird auch der Worker weiterlaufen. :xmas2:



  • Da hast du mcih wohl falsch interpretiert, denn ich hab enur ein einziges Fenster und in diesem wird ein Ladebalken als .bmp angezeigt.
    In der WM_Paint-Routine wird immer ein bisschen mehr von dem Ladebalkenbild geladen und angezeigt, abhängig von einer Variablen, die in dem anderen Rechenthread erhöht wird.
    Da beim normalen RedrawWindow das ganze Fenster flackert wollte ich nur den Teil mit dem Ladebalken aktualisieren.


  • Mod

    Das flackern liegt einzigund alleine an fehledem Double Buffering (CMemDC), oder daran dass eben WM_ERASEBKGND behandelt wird und immer den Background mit zuerst löscht. Wenn man das vermeiden kann, dann flackert auch nichts.


Log in to reply