Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Auf Canvas von anderen Programmen zeichnen. (https://www.delphipraxis.net/141061-auf-canvas-von-anderen-programmen-zeichnen.html)

stiftII 1. Okt 2009 15:10


Auf Canvas von anderen Programmen zeichnen.
 
Hallo :).

Ich versuche vergebens mit Delphi auf dem Canvas von mspaint zu zeichnen.
Ich versuche momentan folgendermaßen ein Rechteck zu zeichnen:

Delphi-Quellcode:
var
  test : TBitmap;
  paint : hwnd;
begin
  paint := FindWindow(NIL,'untitled - Paint');
  CloseWindow(paint);
  test := TBitmap.Create;
  test.Canvas.Handle := paint;
  test.canvas.Brush.Color := CLBLACK;
  test.Canvas.Rectangle(10,10,100,100);
end;
Zuerst suche ich mit FindWindow das Window Handle von mspaint, das funktioniert auch.
Dann weise ich dem canvas meiner bitmap das handle von mspaint zu.

Allerdings wird nichts gezeichnet, gibt auch keine Fehlermeldung oder dergleichen.

Habt ihr ne Idee woran das liegen könnte ?

~stift

jfheins 1. Okt 2009 15:21

Re: Auf Canvas von anderen Programmen zeichnen.
 
Erstmal: Falls das nicht nur aus Spaß an der Fred' ist: Vergiss es. Mir fällt nämlich absolut kein Sinn dafür ein.

Zum Thema: Du hast ein Window-Handle und brauchst aber ein Handel von einem DC. Das bekomst du mit GetDC() ;)

stho 1. Okt 2009 15:23

Re: Auf Canvas von anderen Programmen zeichnen.
 
Geht das überhaupt?!

Also ich sage mal das ich keine Ahnung habe...

aber ich vermute das es nicht geht. Du weißt doch gar net ob mspaint nen canvas hat! Canvas ist doch eine unterklasse der anderen klassen... das ist somit delphi-intern.
oder irre ich mich da?
du könntest ihm parameter übergeben mit welcher farbe er welches pixel bemalen soll aber ich stell wir das SEHR umständlich vor (und weiß auch selber net ob und wie das klappen soll)


EDIT:
Zja, ich war wohl net schnell genug ^^

Fussball-Robby 1. Okt 2009 15:28

Re: Auf Canvas von anderen Programmen zeichnen.
 
Kleiner Tipp: Das Programm WinSpy, hier aus dem Forum. Einfach mal danach suchen (vom toms). Das Gibt der dir den Code aus, mit dem du das Handle von der Zeichenfläche von Paint bekommst (du holst dir nämlich das vom paint Fenster, und nicht von er weißen Zeichenfläche!). Mittels GetDC() bekommst du dann ein Handle des DCs (alle WinForms habe ein Canvas, lediglich grafische Anwendung, die OpenGL o.ä. nutzen, i.d.R. nicht). Dann erstellst du dir ein TCanvas per Variable und weist das DC dem Handle des TCanvas zu (nicht TBitmap erstellen). Auf dein TCanvas kannst du dann zeichnen.
Aber ich sage schonmal: Habe das gerade mal ausprobiert. Zeichnen kannst du dann auf Paint wunderbar, aber sobald das Paint-Fenster in irgendeiner Weise aktualisiert wird(verschoben, anderes Fenster drüber o.ä.) ist deine Zeichnung wieder weg.

Viele Grüße

NickelM 1. Okt 2009 15:40

Re: Auf Canvas von anderen Programmen zeichnen.
 
Es geht. Ich konnte sogar auf dem Fenster eines Spieles zeichenen.
Du musst erstmal wissen wie Paint aufgebaut ist. Welche Klasse die Zeichenfläche ist. Such mal im Forum hier nach WinSpy. Damit kannst du die Fensterhandles rauslesen.
Und wiest welches Handle du brauchst.
Wichtig ist wie auch schon gesagt wurde:

- FindWindow zum Handle finden
- Danach eine TCanvas Klasse createn
- Danach Canvas.hdc zuweisen mit GetDC(FindWindowHandle) also dem Handle den du durch FindWindow hast
- Nach dem kannst du mit der Canvas klasse alles machen.

TCanvas ruft alle API-Funktionen zum zeichen auf. Mit dem Handle, der im in hdc zugewiesen wurde.
Also funkt es durchaus.

Ich hoffe ich konnte dir ein wenig helfen, damit du verstehst wie es geht. Du musst aber nicht unbedingt WinSpy holen. Du kannst auch einfach auf dem Fenster von Paint mit dem FindWindow Aufruf den du gemacht hast zeichnen. Geht auch :mrgreen:

EDIT: War jemand schneller LOL

stiftII 1. Okt 2009 17:23

Re: Auf Canvas von anderen Programmen zeichnen.
 
Klappt super. Vielen Dank!:)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz