![]() |
Screenshot - Verständnisfrage
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... :wall: Der Code funktioniert auch prima... nur leider weiß ich nicht genau warum... :| Hier erstmal der Code:
Delphi-Quellcode:
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? :coder2: Das ist doch irgendwie doppelt gemoppelt! :?
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; Und dann versteh ich die Schritte mit SelectObject und CreateCompatibleBitmap nicht, geschweige denn das DeleteObject(SelectObject()). Ich hoffe ihr könnte mir helfen! :D 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? |
AW: Screenshot - Verständnisfrage
Du kannst auch einfach nur per Canvas arbeiten
Delphi-Quellcode:
procedure Screen2Canvas(DestCanvas:TCanvas;DestRect:TRect);
var C:TCanvas; begin C:=TCanvas.Create; C.Handle := GetDC(0); try DestCanvas.CopyRect(DestRect,C,DestRect); finally ReleaseDC(0,C.Handle); c.Free; end; end; procedure TForm2.Button1Click(Sender: TObject); begin Screen2Canvas(Image1.Canvas,Rect(0,0,Screen.Width,Screen.Height)); end; |
AW: Screenshot - Verständnisfrage
@Bummi: Danke für die Antwort. Sieht ehrlich einfacher aus... aber ich glaube, das war auch eine der Varianten, die ich schon ausprobiert hatte und die nicht geklappt hat.
Und irgendwas muss ja den Mehraufwand bei meiner Methode rechtfertigen... was ist daran besser? Zu deiner Methode: Funktioniert die auch, wenn man die in eine DLL auslagert? Das hab ich nämlich, vlt lag's daran? |
AW: Screenshot - Verständnisfrage
Ein wenig aus der deutschen OH
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: Screenshot - Verständnisfrage
Hey, das hört sich schonmal gut an! :)
Aber mir ist noch nicht klar, wofür SelectObject gut ist. Das hört sich für mich so an, alls wenn dort ein Obejkt durch ein anderes ersetzt wird. Aber das ist ja nicht der Sinn dahinter, oder? Und dann ist mir auch noch unklar, warum bei DeleteObject erst noch SelectObject(CompDC,h) in den Klammern steht. Kannst du mir da auch nochmal helfen? |
AW: Screenshot - Verständnisfrage
Unabhängig der Bedeutung
Delphi-Quellcode:
gibt das Handle des ersetzten Objekts. In diesem Fall
function SelectObject(DC: HDC; hObject: THandle): THandle;
Delphi-Quellcode:
die der Bitmap.
h := SelectObject(CompDC,ScreenBitmap);
Delphi-Quellcode:
löscht die virtuelle Bitmap.
DeleteObject(SelectObject(CompDC,h));
Warum aber SelectObject in DeleteObject? SelectObject ersetzt nur das Objekt. Der einzige Grund der mir auf die Schnelle einfällt ist, dass SelectObject zur Sicherheit eingesetzt wurde, denn hier wird nur ersetzt, d. h. es kommt ein Handle zurück, oder Null oder Error. Ist das zurückgegebene Handle nicht gültig, wird auch nichts gelöscht. Man kann mit den Aufruf nichts verlieren aber evtl. etwas gewinnen. (meine unfachmännische Meinung) |
AW: Screenshot - Verständnisfrage
Zitat:
|
AW: Screenshot - Verständnisfrage
So langsam ergibt es einen Sinn.
Delphi-Quellcode:
Ok, GetDC ermittelt das Handle für einen Gerätekontext, CreateCompatibleDC erzeugt einen kompatiblem Gerätekontext, CreateCompatibleBitmap erzeugt eine Bitmap die für SelectObject Voraussetzung ist. BitBlt kopiert dann alles an die richtige Stelle. Zuletzt wird aufgeräumt.
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; Ob das alles nötig ist, weiß ich nicht, es ist aber, soweit ich es beurteilen kann, ist es so wie es sein soll. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz