Graphics-Objekt aus HWND erstellen
-
Ich habe derzeit Probleme damit, ein Graphics-Objekt der GDI+ nicht nach BeginPaint und mithilfe eines HDC, sondern direkt per gegebenem HWND zu erstellen. Es existiert ja sowohl ein entsprechender überladener Konstruktor, als auch eine spezielle Funktion FromHWND.
Was ich also tue ist, in der Window Procedure meines Custom Controls beim Verarbeiten von WM_NCCREATE eine Instanz einer Klasse zu erstellen, die verschiedene Dinge der Control verwaltet. Dem Konstruktor dieser Klasse wird das hwnd der Window Procedure mitgegeben, und soll dann unter anderem mit
graphics = Graphics::FromHWND(hwnd_new);die Member-Variable graphics vom Typ Graphics* füllen.
Wenn ich aber später in Reaktion auf WM_PAINT eine Funktion der Klasse ausruft, die mithilfe dieses Graphics-Objekts etwas zeichnen soll, dann geht das nicht mehr, wohingegen es unter Verwendung eines HDC, das von BeginPaint direkt in der Funktion selbst zurückgegeben wurde, einwandfrei funktionierte.
Was mache ich denn hier falsch?
Editiert: Ich habe gerade im Konstruktor mithilfe von BeginPaint und EndPaint, sowie einem per HDC erstellten Graphics-Objekt festgestellt, dass auch hier anscheinend derselbe Fehler besteht, was das ganze hier mehr zu einem allgemeinen Problem als einem GDI-Problem machen würde. Aber sicher bin ich mir nicht.
-
Okay, ich konnte das Problem lösen, indem ich einfach GetDC benutze und wie bisher per HDC das Graphics-Objekt erstelle.
Es stellt sich aber trotzdem noch die Frage, wozu denn dann der Konstruktor mit einem HWND gut ist und unter welchen Bedingungen man den erfolgreich benutzt.
-
Hmm, anscheinend war obiges etwas voreilig. GetWindowDC funktioniert einwandfrei, nimmt allerdings den 2 Pixel dicken Rahmen, der aus dem CLIENTEDGE-Style resultiert, mit ins Koordinatensystem, was alles durcheinanderbringt. Wenn ich aber GetDC nutze, um damit das Graphics-Objekt zu erstellen, dann funktioniert wieder gar nichts. Prinzipiell aber anscheinend schon, wenn ich nämlich GetDC(NULL) benutze, also den ganzen Bildschirm, dann erscheint wieder alles ganz normal, nur halt an der oberen linken Ecke des Bildschrims. Es muss also irgendwie am Window liegen, auf das ich die Funktion anwenden will.
Wie gesagt: Ich benutze die Funktion auf ein selbsterstelltes Control. Aber da das ganz normal mit CreateWindowEx erstellt wurde und ich sein HWND gescheit vorliegen habe, dürfte es da doch eigentlich keine Probleme geben mit GetDC, oder?
Ich verstehe einfach nicht, was hier das Problem sein soll! Genausowenig, wie ich verstehe, warum es per HWND nicht zu funktionieren scheint. Ich denke aber sogar, dass die beiden irgendwie verbunden sind. Eine Antwort käme mir jedenfalls sehr gelegen!
-
Hallo,
ich kann dir leider nicht helfen, weil ich nicht über die nötige Erfahrung verfüge, aber vielleicht kannst du mir etwas helfen.
Ich erstelle wie du ein Grafik Object:Graphics^ FensterGrafik = System::Drawing::Graphics::FromHwnd(target);
Das Handle ist von einem "fremden" Windowsfenster.
Ich male dann in dem Fenster, das klappt auch, doch wird das von
mir gemalte immer wieder von dem Fenster übermalt.
Hast du eine Idee wie ich das verhindern kann das meine
Sachen übermalt werden?Gruß Foxy
-
Kannst du nicht ... du musst schon die messages des Fenster abfangen und dann auf wm_paint reagieren und vorher das programm selbst auf wm_paint reagieren lassen.