Neuzeichnen von Fenstern mittels InvalidateRect
-
Hi,
ich male in einem fremden Programm rum und möchte ab und an das gemalte wieder wegbekommen, dazu rufe ich dann "InvalidateRect(anderesProgramm,NULL,FALSE)"; auf. Das zeichnet das komplette fenster neu. Da ich das recht oft aufrufe fängt das andere Programm irgendwann an ne hohe Prozessorauslastung zu bekommen, ich denke es liegt daran. Deshalb würde ich gern nur die Stellen neuzeichnen lassen, wo ich draufgemalt hab. Wie kann ich das denn machen?
Thx
-
Indem Du auch nur das Rectangle angibst in dem Du etwas verändert hast (lies die Doku zu InvalidateRect). Wenn das andere Programm jedoch keine intelligente Update Logik für das Neuzeichnen hat, dann wird auch das kaum etwas verändern.
-
Ok also muss ich das Recatangle immer selbst angeben?
Gibt es keine Funktion, die das Fenster überprüft und nur das neuzeichnet, was vorher "noch nicht da war" ?
Sozusagen selbst erkennt, was nicht mehr gültig ist..und wenn es mehrere Stellen zum neuzeichnen gibt? also Oben links und unten rechts? nehm ich dann einfach das komplette Rect oder 2 mal InvalidateRect aufrufen mit 2 verschiedenen Rects?
-
Wenn Du das rectnagle nicht angibst, wird alles neu gezeichnet.
Wenn Du mehrere Bereiche angibst wird ein Update Rectangle gebildet, aus der linken oberen und rechten unteren Ecke. Es ist absolutlegitim InvalidateRect mit mehreren Update Rect's aufzurufen.
Aber entscheidend ist überhaupt: Optimiert das Programm/Fenster die Anzeige, oder wird immer alles neu angezeigt...
-
also das programm zeichnet nicht immer alles neu..
es zeichnet nur die veränderungen.d.h. wenn ich in das fenster oben links einen kreis male wird der niemals neu gezeichnet, weil das fenster dort halt nie neuzeichnet (von sich aus). Es zeichnet mehr in der mitte des Fensters ab und zu was neu..
-
Du weisst nicht was intern passiert. Der DC der erzeugt wird, hat einen entsprechenden Clipping Bereich. Es wird grunsätzlich nichts ausgegeben wenn ein Bereich nicht invalidiert wurde.
Aber intern kann die WM_PAINT Routine dennoch das gesamte Fensterrechteck ausgeben, der Rest wird geclippt.