Autor Beitrag
Ecthelion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Mo 06.01.03 18:51 
Wir brauchten diesen Begriff in einer Prozedur für Screenshots, die wir einfach im Forum gefunden haben. Wir würden gern verstehen, was es im einzelnen bedeutet und auch den Begriff: DC (heißt das "Desktop Canvas" oder so?)
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Mo 06.01.03 19:27 
Wir? Redest du von mehreren Leuten, oder lässt du dich mit euer Gnaden anreden :lol:

DC steht für Device Content (deu.: Geräte Kontext). Dieser erlaubt es dem Programmierer ohne Wissen über das Zielgerät Befehle an dieses zu senden und Informationen zu ermitteln. So kann ein Programm, ohne eine spezielle Programmierung für jede einzelne verfügbare Grafikkarte, immer die gleichen Befehle verwenden. Es muss auch nicht zwischen einem Drucker und einer Grafikkarte unterscheiden.

Die Geräte Kontexte werden vom GDI (Graphic Device Interface), die die gesamte grafische Darstellung übernimmt, zur Verfügung gestellt. Die Funktionen des GDI müssen natürlich wissen, worauf zu zeichnen ist. Und deswegen benötigen sie einen DC.
Delphi wiederum kapselt die Funktionen des GDI in TCanvas, womit der DC eigentlich vom Programmierer nicht mehr benötigt wird, da TCanvas die Arbeit mit dem DC übernimmt. So wird z.B. bei TCanvas.LineTo(X, Y) die GDI Funktion LineTo(Handle, X, Y) aufgerufen. Da TCanvas jedoch nicht alle GDI Funktionen kapselt, haben die Entwicker die Eigenschaft Handle bereitgestellt.

_________________
Ist Zeit wirklich Geld?
Ecthelion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Mo 06.01.03 21:33 
An dem Projekt arbeiten 2 Typen, daher wir. Deine Erklärung ist zwar sehr umfangreich, einem Delphi- (und überhaupt Windows-basierter Programmierung) Neuling aber zu komplex.

Ich werd mal etwas konkreter:

c.Handle := GetWindowDC(GetDesktopWindow)

Diese Zeile scheint beim Screenshot erstellen eine besondere Rolle zu spielen. Was hat es mit der Funktion GetWindowDC und dem Argument GetDesktopWindow jeweils konkret auf sich? Letzteres ist wohl das auf dem Bildschirm angezeigte selbst, aber welche Rolle genau spielt GetWindowDC als Funktion, und wie muss ich (müssen wir) verstehen, dass es in der Handle-Eigenschaft abgelegt wird?
FloFri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97



BeitragVerfasst: Di 07.01.03 13:00 
Ich habe es herausgefunden, was der Canvas-Handle genau bewirkt! In dem Canvas-Handle steht der DC-Handle (ist ähnlich dem HWND) auf den das Canvas wirkt. Ist standartmäßig deine Form1. Ist etwas schwierig zu verstehen, aber wenn du da den DC-Handle des Desktops nimmst (c.Handle := GetWindowDC(GetDesktopWindow) ) kannst du mit dem canvas auf dem desktop zeichnen. Und dadurch auch den gesammten desktop kopieren (Screenshot). Du kannst natürlich auch den Desktop als zeichen fläche nehmen, is auch ganz lustig ein Game direkt auf dem desktop zu zeichnen, anstatt in einer Form :) . Das gezeichnete verschwindet wieder, wenn du dein Prog beendest und die "beschmierten" Teile des Bildschirms aktualisiert werden (Fenster darüber, etc. )
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 07.01.03 15:12 
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ß:

ausblenden 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.
Ecthelion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Di 07.01.03 16:11 
Ah, also ich glaube die Gesamtheit aller Antworten hat Erleuchtung gebracht. Danke sehr :)