| Ecthelion hat folgendes geschrieben: |
Ich werd mal etwas konkreter:
c.Handle := GetWindowDC(GetDesktopWindow) |
AndyB hat eigentlich sehr gutes Hintergrundwissen geliefert, hier aber etwas spezifischer:
Dein c aus c.Handle ist eigentlich ein Var c: TCanvas. Canvas ist die Leinwand auf der gezeichnet werden kann. Viele Komponenten (und auch das Formular) in Delphi haben eine Canvas. Hat ein Objekt eine Canvas, dann kannst du drauf mit den Canvasbefehlen zeichnen. Das ist, wenn man sich erst an sie gewöhnt hat, sehr einfach. Aber Canvas ist jetzt keine bestimmte Eigenschaft von bestimmten Objekten, sondern einfach eine Klasse. Du kannst also jede Zeit selbst ein TCanvas Objekt erstellen.
Jetzt unterbreche ich mal kurz die Canvasbeschreibung und gehe direkt an die GDI. Du kannst auch ohne Canvas mit der Grafik arbeiten, allerdings ist alles dann viel schwerer. Hier ein kleines Beispiel wie man ohne Canvas eine Linie zeichnen kann/muß:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var dc : HDC; hp,ho : HPen; ... dc := GetDC(Handle); // Anlegen DC hp := CreatePen(0, 10, 0); // Anlegen neues Objekt (Stift) ho := SelectObject(dc, hp); // Auswählen Objekt LineTo(dc, 220,210); // Grafikausgabe SelectObject(dc, ho); // Wiederherstellen Objekt DeleteObject(hp); // Löschen Objekt ReleaseDC(Handle,dc); // Löschen DC |
Du mußt also vieles von "hand" machen was sonst Canvas für dich erledigen würde. Du kannst also auch ein Screenshot ohne Canvas machen, es wird aber viel komplizierter.
Deshalb machen sich die Leute die Delphi haben das ganze viel einfacher. Sie erstellen ein Canvas Objekt und setzen (mit Hilfe von Canvas.Handle) den Desktop Gerätekontext mit dem Canvas gleich. Das Ergebnis ist, daß du (über Canvas) und der Desktop auf der gleichen "Leinwand" zeichnen. Du hast sozusagen den Bildschirm angezapft. Das ganze bringt jetzt viele Vorteile mit sich. Der Hauptvorteil ist, daß du jetzt nicht mit API Funktionen arbeiten mußt, sondern mit den Delphi Grafikfunktionen. Du kannst z.B. eine Linie drauf zeichnen oder einen Bildschirmbereich (aus der Canvas) in eine Bitmap (die hat auch eine {eigene} Canvas) kopieren. Du kannst aber auch die ganze Canvas in die Bitmap kopieren - das ist dann das ScreenShot.
Lies dir jetzt noch mal den Beitrag von AndyB durch und es wird dir jetzt vieles logischer erscheinen.