Hallo alle zusammen!
Da hab ich mich letztens dumm und dämlich gesucht nach einem funktionierenden Screenshotcode und da stand er doch direkt vor meiner Nase in dem dicken Delphischmöker...
Der Code funktioniert auch prima... nur leider weiß ich nicht genau warum...
Hier erstmal der Code:
Delphi-Quellcode:
procedure ScreenshotBook(bmp: THandle);
stdcall;
var ScreenDC, CompDC: HDC;
ScreenBitmap: HBitmap;
h: THandle;
begin
ScreenDC := GetDC(0);
//DC des gesamten Bildschirm abfragen
CompDC := CreateCompatibleDC(ScreenDC);
//einen neuen DC anlegen, der gleich dem DC vom Bildschirm ist??
ScreenBitmap := CreateCompatibleBitmap(ScreenDC,
GetDeviceCaps(ScreenDC,HORZRES),
GetDeviceCaps(ScreenDC,VERTRES));
//hä? ein Bitmap wird angelegt ... und dann?
h := SelectObject(CompDC,ScreenBitmap);
//das versteh ich auch nicht so genau...
BitBlt(CompDC,0,0,GetDeviceCaps(ScreenDC,HORZRES),
GetDeviceCaps(ScreenDC,VERTRES),ScreenDC,0,0,SRCCOPY);
//klar, hier wird der Inhalt aus ScreenDC in CompDC kopiert
BitBlt(bmp,0,0,300,300,compDC,0,0,SRCCOPY);
//Inhalt von CompDC in ein mitgeliefertes Handle
DeleteObject(SelectObject(CompDC,h));
//?? und vor allem: warum selectObject in deleteObject??
DeleteDC(CompDC);
//künstlich erzeugtes DC freigeben
ReleaseDC(0,ScreenDC);
//Freigeben des abgefragten Bildschrim-DCs
end;
Erstens frage ich mich, ob das wirklich so umständlich sein muss?! Warum frage ich den Bildschirm-
DC ab, erzeuge dann ein neuen
DC und kopier aus dem Bildschirm-
DC den Inhalt in den neuen
DC um den da dann wieder rauszukopieren?
Das ist doch irgendwie doppelt gemoppelt!
Und dann versteh ich die Schritte mit SelectObject und CreateCompatibleBitmap nicht, geschweige denn das DeleteObject(SelectObject()).
Ich hoffe ihr könnte mir helfen!
LG; hans ditter
//EDIT:
Ach ja, und eine Frage hätte ich noch: Warum geht das nur mit Form.Canvas.Handle bzw. Paintbox.Canvas.Handle nicht aber mit Image1.Picture.Bitmap.Handle (vlt wegen HBITMAP?) oder Image.Picture.Bitmap.Canvas.Handle?