GDI+ Grafik / OnPaint

TheShihan

Mitglied
Hallo,

Ich habe eine MFC Anwendung geschrieben in der mit Hilfe von GDI+ ein Bild auf dem Dialog gezeichnet wird.

Wird das Fenster und so verschoben wird das gezeichnete Bild auch schön mitverschoben.

Wird das Fenster jedoch verkleinert, oder quasi an der Titelleiste gepackt und einmal unter die Taskleiste geschoben (schwer zu beschreiben, einfach so, dass der Hauptbereich nicht mehr sichtbar ist, sondern nur noch der Name) und dann wieder hochgeschoben, so ist die Stelle an der das Bild war leer.

Mir ist schon irgendwie klar warum er das macht.. (son kleines Bisschen ;-)) aber gibt es eine möglichkeit das er es trotzdem wieder zeichnet. Oder muss ich es extra dann via OnPaint() wieder an der gew. Stelle zeichnen lassen?

Danke und Gruss, Shi
 

MCoder

Erfahrenes Mitglied
... in der mit Hilfe von GDI+ ein Bild auf dem Dialog gezeichnet wird.
Werden alle Zeichenoperationen innerhalb von OnPaint() ausgeführt? Das wird nämlich immer dann aufgerufen, wenn der Fensterinhalt neu gezeichnet werden muss (z.B. nach einer Überdeckung). Steht dein Code da nicht drin, ist das Bild dann leider weg.

Gruß
MCoder
 

TheShihan

Mitglied
nein, die Zeichenmethode steht separat und wird je nach Benötigung dann aufgerufen.. im OnPaint wäre sie nur drinn wenn es nicht anders geht.. eben um das Bild nach dem "löschen" wieder neu zu zeichnen.
 

MCoder

Erfahrenes Mitglied
Bei der Windows-Programmierung werden Zeichenoperationen grundsätzlich immer im WM_PAINT Message-Handler ausgeführt. Ansonsten hast du keine Chance, auf äußere Einflüsse, die ein Neuzeichnen erfordern, reagieren zu können.
Also pack einen Aufruf für dein Bildzeichnen in OnPaint().

Gruß
MCoder
 

TheShihan

Mitglied
ok, ich hab das so eingebaut. Danke.
---------

Noch was anderes/ähnliches.. wenn ich in diesem "graphic" Bereich ein Bild zeichne und danach ein anderes Bild anklicke (die Namen sind in einer ListCtrl) dann klatscht es mir ja das neue Bild über das alte... stört mich nicht, das Problem ist nur, wenn das neue Bild kleiner ist, als das alte war, dann sieht man im Hintergrund noch einen Teil des alten Bildes darüber hinauslappen..

Erst wenn das Fenster ganz neu gezeichnet wird, verschwindet das alte Bild ganz (da ja im OnPaint nur das neue wieder gezeichnet wird).

Hat jemand ne Idee wie man das alte Bild vorher weglöschen kann? Ich hab mal einiges ausprobiert mit z.B. invalidate() oder invalidaterect(), doch funktioniert das so nicht. Es gibt von GDI+ auch noch ein Graphics::clear(...), dort gebe ich dann die Hintergrundfarbe mit. Das funktioniert so halb... am liebsten würde ich ja sowas sagen wie "mach die Farbe transparent", doch finde ich das nicht in der Liste. Wenn ich eine Farbe direkt angebe z.B. Color(5, 6, 7) dann zeichnet es das korrekt (aber ich möchte halt die Transparenz). Habe auch testweise solche Sachen ausprobiert:
Code:
graphics.Clear(CTLCOLOR_DLG);
Oder andere Schnippsel dir mir die Hintergrundfarbe des Dialoges geben sollten, jedoch kommt dann jeweils immer schwarz als Hintergrundfarbe (auch z.B. bei 3DFace etc.).

Hoffe ihr versteht was ich meine :-\

Danke und Gruss, Shi
 

langer1801

Erfahrenes Mitglied
Hallo,

ich weiß leider nicht, wie deine Zeichenroutine aussieht. Aber der Hintergrund wird im Message-Handler von WM_ERASEBKGND bearbeitet. Du mußt den Handler einbauen und dort kannst du dann den Hintergrund neu zeichnen lassen, bevor du das neue Bild einfügst.

Mfg

langer
 

MCoder

Erfahrenes Mitglied
Ich hab mal einiges ausprobiert mit z.B. invalidate() oder invalidaterect(), doch funktioniert das so nicht.
Das sollte funktionieren, denn Invalidate() löst auch eine WM_ERASEBKGND Nachricht aus (OnEraseBkgnd), die, bevor WM_PAINT zum Zuge kommt, den Hintergrund löscht. Sofern du den Messagehandler nicht explizit überschreiben hast, sollte das alte Bild eigentlich zuverlässig verschwinden.

Gruß
MCoder
 

KainPlan

Mitglied
Also wenn du's nicht anders hinbekommst dann Zeichne einfach ein "Löschendes" Rect also quasi:

(Grafikobj)->DrawRectangle((BGColor), Fenstergröße)

und dann deinen eigentlichen code...