Hintergrund nicht loeschen



  • Was muss ich machen das der bei einer WM_PAINT Nachricht den Hintergrund meines Client-Fensters nicht loescht?



  • Drück dich mal genauer aus, das blickt ja keine Sau 🙄



  • Eigentlich drueckt das mein Problem ziehmich genau aus, aber ihc versuche es mal zu praezisieren:

    Ich habe ein Fenster und in desem Client Bereich lasse ich bei Mausclicks an entsprechenden Stellen etwas mittels Windows GDI Funktionen zeichen. Wenn ich jetzt die groesse das Fensters aendere ist alles weg was ich da rein gezeichnet habe, das passt mir nicht. Also wuesste ich jetzt gerne wie ich es ereichen kann das der das was da gezeichnet ist in dem geaenderten Fenster (soweit moeglich) auch anzeigt.



  • Immer in ein Memory DC schreiben und dieses immer in WM_PAINT blitten. Dann bleibt alles erhalten



  • Das hab ich jetzt so auf anhieb nicht verstanden. Werde mal versuchen rauszufinden was damit gemeint ist, aber wenn du da ein kurzes Beispiel parat hast, waere das ja vielleicht hilfreich. Aber trotzdem mal Danke!



  • Du musst dich selber abfangen und dann deine Maloperationen ausführen! Ganz einfach.



  • Hallo!

    Es gib 2 Sachen, die man machen muss um das zu erreichen: DoubleBuffering, und die WM_ERASEBKGND Messageabfangen.

    1. DoubleBuffering: Du legst dir im Speicher ein Bitmap an die genausogros ist wie deine Zeichenfläche, die du mit GetClientRect abfragen kannst.
    Wenn du etwas zeichnest, dann baust du zuerst dein ganzes bild komplett in dieser Memory DC ab und Bltest sie abschliesend auf den Bildschirm.

    2. Windows schick die WM_ERASEBKGND Message, die du abfangen musst(return 1)! Die DefWindowProc Funktion löscht bei dieser Nachricht nämlich den Teil des Bildschirms der neu gezeichnet werden soll.



  • Original erstellt von <Jürgen>:
    Es gib 2 Sachen, die man machen muss um das zu erreichen: DoubleBuffering, und die WM_ERASEBKGND Messageabfangen.

    Ich stehe da eher auf WM_PAINT. Aber soll es jeder so machen, wie er es für richtig hält. 😉



  • Man kann ja auch Double-Buffering in der WM_PAINT realisieren!
    Und die WM_ERASEBKGND Message abfangen, weil die DefWindowProc bei dieser Message den Hintergrund durch die Hintergrundfarbe löscht, und dass will ich ja nicht, weil es dann flimmert. Die WM_ERASEBKGND Message wird vor der WM_PAINT Message geschickt, wenn der Bildschirm gelöscht werden soll.

    Natürlich kann man bei der InvalidateRect FALSE fürs löschen angeben, da gibt es aber Probleme bei einer MDI-Struktur, wenn die Fenstergroesse mit SetWindowPos geändert wird.



  • Original erstellt von WebFritzi:
    [quote]Original erstellt von <Jürgen>:
    [qb]Es gib 2 Sachen, die man machen muss um das zu erreichen: DoubleBuffering, und die WM_ERASEBKGND Messageabfangen.

    Ich stehe da eher auf WM_PAINT. Aber soll es jeder so machen, wie er es für richtig hält. ;)[/QB][/QUOTE]

    Du hast wieder einmal keinen blassen Schimmer...



  • Also ich bin ja dafür, einfach WNDCLASS::hbrBackground mit GetStockObject(NULL_BRUSH) zu initialisieren. 🙂

    btw:
    WM_PAINT wird natürlich auch dann gesendet, wenn das Fenster minimiert und wiederhergestellt wurde. Dann ist das Fenster logischerweise komplett leer.
    Man kann also auch dann nicht davon ausgehen, dass der letzte Inhalt da bleibt.
    Das ist der Sinn von WM_PAINT. 🙂

    <Jürgen>s Methode mit dem DoubleBuffering ist die übliche, wenn du schnell viel zeichnen musst und das möglichst flimmerfrei. DoubleBuffering hatten wir übrigens schon öfter, such einfach mal hier im Forum.

    [ Dieser Beitrag wurde am 24.04.2003 um 19:37 Uhr von cd9000 editiert. ]



  • Also ich bin ja dafür, einfach WNDCLASS::hbrBackground mit GetStockObject(NULL_BRUSH) zu initialisieren.

    Man lernt nie aus!
    Danke cd9000 😉 !!!

    Das macht den Code meiner weiteren Programme wieder ein bisschen kürzer, und ist auch viel logischer und eleganter als "hinterherhinkend" die WM_ERASEBKGND Message von Windows abzufragen! 🙂



  • BTW: Den Aufruf von GetStockObject kann man auch noch weglassen, wenn man hbrBackground einfach auf NULL setzt.



  • Das ist sogar noch eleganter, obwohl es aufs selbe rauskommt. 🙂
    Was sagt die Forenüberschrift? "Doku des Platform SDK"... 🙄


Anmelden zum Antworten