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.