Wie kann ich das neuzeichnen verhindern?
-
Hi,
ich habe da ein Problem. Ich habe ein Programm geschrieben, in dem ich beim Start die WM_PAINT auch nicht benötigt habe. Das Prgramm läuft super, bis der Inhalt des Fensters ungültig wird und neu gezeichnet werden muss. (Wenn das fenster verschoben wird, in den Hintergrund gerät und wieder in den Vordergrund kommt...) Das neuzeichnen wäre in diesem Programm äußerst ungünstig. Nun meine Frage, kann ich es irgendwie verhinder, das der Inhalt des Fenster als Ungültigerklärt wird, so das es nicht neu gezeichnet werden muss.
Danke
-
Du rufst in WM_PAINT einfach ValidateRect auf, dann ist der Inhalt wieder als gültig markiert. Allerdings wird dir das nicht viel nutzen; der Inhalt ist dann zwar "gültig", aber immer noch unvollständig.
Wenn man unter Windows programmiert, muss man seine Programme so entwerfen, dass die Fenster sich jederzeit (Betonung auf jederzeit) neuzeichnen können. Vielleicht ist in deinem Programm ein Designfehler.
-
1. Verstehe ich leider deine Frage, bzw. das was du erreichen willst, nicht.
2. Die von cd9000 vorgeschlagene Möglichkeit ist wohl der Beste weg.
3. Vielleicht ist dies aber auch eine Möglichkeit (vgl. Nr. 1)WNDCLASSEX windowclass; // ... windowclass.style = NULL; //CS_HREDRAW | CS_VREDRAW; // ...
-
Im Bezug auf den Beitrag von cd900.
Ich denke ich muss es anders machen, ich weis nur nicht wie ich es angehen soll.
Es ist ein kleines Schreibmaschienen - Programm zum erlernen des 10 Fingersystems.
Da habe ich im header eine Struktur in dem ich den vorgegebenen Text habe.
Diesen Text schreib ich dann nachdem der entsprechender Menüeintrag erfolgt mit Hilfe von TextOut auf den Bildschirm. Das kann ich ja über WM_PAINT auch jedes mal einfach neuzeichnen lassen, aber..Der Anwender tippt dann die Buchstaben, die er tippen soll, ein und diese erscheinen dann unter der vorgegebenen Zeile. Auch über TextOut. Jede Falsche Taste erscheint rot ansonsten schwarz. Nun wie soll ich denn das bis zu der stelle Speichern wie der Benutzer war, er kann ja nicht wieder neu mit er Zeile beginnen.
Ich hoffe ich drücke mich nicht zu schwer aus und hoffe das mir jemand helfen kann.
Aber wenn ich den ganzen Quellcode hier reinsetze, ich weis nicht ob das nicht vielleicht ein wenig Iritiert.
Vielleicht weis jemand wie ich es meine und kann mir sagen wie ich es am besten mache.
Ich bin auch erst neu auf diesem Gebiet, darum fällt es mir noch ein wenig schwer!
Danke!
-
Schreibe nicht direkt auf das Canvas des Fensters, sondern auf ein Bitmap im Speicher. Und jedesmal wenn sich was ändert kopierts du es mit BitBlt auf den Canvas deines Fensters, also auch in WM_PAINT.
-
Bitte nicht so schnell!
Wie kann ich denn Zeichen bzw. eine ganze Zeichenkette in einem Bitmap Speichern?
Und was meinst du mit Canvas? Etwa den Inhalt des Fensters?
-
Stegi schrieb:
Und was meinst du mit Canvas? Etwa den Inhalt des Fensters?
Damit meint er die Zeichenfläche des Fensters, die man in WinAPI auch mit "Device Context" bezeichnet. Der Begriff "Canvas" kommt aus der Delphi/C++Builder - Ecke.
-
Schau dir mal in der MSDN die folgenden Befehle an: CreateCompatibleDC, CreateCompatibleBitmap, SelectObject, BitBlt und / oder suche dir ein Tutorial o.ä. zu DoubleBuffering (BackBuffering)
siehe z.B. BackBuffer oder Double Buffering