Wie lässt sich Fensterinhalt schützen, der *NICHT* mit WM_PAINT ausgegeben wurde?



  • Fast automatisch wird der Fensterinhalt wiederhergestellt, wenn Texte, Grafiken etc. unter WM_PAINT ausgegeben werden.
    Völlig anders sieht es aus, wenn eben dasselbe auf eine andere Weise ausgegeben werden muss, in meinem Fall durch WM_LBUTTONDOWN bzw. WM_RBUTTONDOWN. Wird das Fenster überlagert, dann ist die darunterliegende Grafik vernichtet und wird unter keinen Umständen wieder hergestellt (Experimente mit InvalidateRect & Co. führen zu nichts…).
    Wie kann ich Windows davon überzeugen, dass es sich die überlagerten Flächen trotzdem „merkt“ und bei Bedarf wieder darstellt?



  • Du musst WM_PAINT unterstützen; daran führt AFAIK kein Weg vorbei...



  • Man könnte ja im WM_LBUTTONDOWN Handler in ein Memory DC reinzeichnen, dann InvalidateRect aufrufen und in WM_PAINT wird dann dieser Memory DC ins Fenster gezeichnet.



  • Es macht manchmal schon Sinn direkt zu zeichnen. Trotzdem muss man es sich merken, was man gezeichnet hat, damit man für genau diesen Fall noch weiss was man tun muss.



  • mom schrieb:

    Man könnte ja im WM_LBUTTONDOWN Handler in ein Memory DC reinzeichnen, dann InvalidateRect aufrufen und in WM_PAINT wird dann dieser Memory DC ins Fenster gezeichnet.

    Und was machst Du, wenn sich Fenstergröße, Bildschirmgröße oder Farbtiefe ändern?
    Direkte Ausgaben in den Fenster-DC gehören grundsätzlich in die Behandlung der WM_PAINT-Nachricht.



  • Alles, was Du nicht unter WM_PAINT zeichnest, wird bei WM_PAINT übermalt. Du kannst natürlich die Graphik vorher ausgeben, dann als Bitmap speichern und dann bei WM_PAINT wieder ausgeben. Ist aber irgendwie doppelt gemoppelt.



  • Und wie sage ich dann meinem Rechner, dass er beim Klick mit der linken Maustaste "das-und-das" zeichnen soll, und beim Klick mit der rechten Maustaste "das-und-das"?
    Es geht ja nicht darum, dass der Rechner immer dasselbe darstellen soll. Das könnte man natürlich mit WM_PAINT machen...



  • Mit Variablen!



  • Du erstellst einen Memory-DC, darin wird alles gezeichnet, bei LBUTTONDOWN halt Grafik01 und bei RBUTTONDOWN Grafik02. Wenn das Fenster die Größe ändert oder so, dann resized Du den Memory-DC.
    Bei WM_PAINT blittest Du den Memory-DC in das Fenster, einfach stur rüber-blitten. Der Inhalt ist gesichert und wird bei WM_PAINT wieder hergestellt und alle sind glücklich und zufrieden und leben bis ans Ende ihrer Tage. 😃


Anmelden zum Antworten