![]() |
Screenshot vom Clientbereich der Mainform machen
Hallo,
ich nutze folgenden Code um von meiner MainForm einen ScreenShot zu erstellen:
Delphi-Quellcode:
Nur würde ich gerne nur einen ScreenShot vom Client-Bereich zu machen. Also alles innerhalb der Ränder/Taskleiste.
procedure ScreenShot_erstellen(Pfad: String);
var Bitmap : TBitmap; Canvas : TCanvas; WindowRect: TRect; BitmapRect: TRect; begin //Bitmap erzeugen Bitmap := TBitmap.Create; //Canvas erzeugen Canvas := TCanvas.Create; //Handle für Canvas angeben Canvas.Handle := GetWindowDC(GetDesktopWindow); //Rect von MainForm holen GetWindowRect(Application.MainForm.Handle, WindowRect); try BitmapRect := Rect(0, 0, WindowRect.Right - WindowRect.Left, WindowRect.Bottom - WindowRect.Top); //Bitmap-Größe angeben Bitmap.Width := WindowRect.Right - WindowRect.Left; Bitmap.Height := WindowRect.Bottom - WindowRect.Top; Bitmap.Canvas.CopyRect(BitmapRect, Canvas, WindowRect); //nur für den Thread - eigentlich steht zum Speichern noch etwas mehr Code dahinter Bitmap.SaveToFile(Pfad + 'Bild.jpg'); finally //Bitmap löschen und freigeben FreeAndNil(Bitmap); //Canvas löschen und freigeben ReleaseDC(0, Canvas.Handle); FreeAndNil(Canvas); end; end; Ich vermute ich muss die Nullen bei:
Delphi-Quellcode:
durch Startwerte ersetzen, die innerhalb des Fensters sind.
BitmapRect := Rect(0, 0, WindowRect.Right - WindowRect.Left, WindowRect.Bottom - WindowRect.Top);
Nur weiss ich nicht wie ich an "ClientLeft" und "ClientTop" komme. (Es gibt ja nur ClientWidth und ClientHeight) Oder gibt es den Clientbereich als Rect? |
AW: Screenshot vom Clientbereich der Mainform machen
Wieso fallen mir nur immer die Lösungen ein, nachdem ich gepostet hab ... :gruebel:
Delphi-Quellcode:
procedure ScreenShot_erstellen(Pfad: String);
var Bitmap : TBitmap; Jpg : TJpegImage; BitmapRect: TRect; i_Width : Integer; i_Height : Integer; begin //Bitmap erzeugen Bitmap := TBitmap.Create; i_Width := Application.MainForm.ClientWidth; i_Height := Application.MainForm.ClientHeight; try //Rect des Clientbereiches definieren BitmapRect := Rect(0, 0, i_Width, i_Height); //Bitmap-Größe angeben Bitmap.Width := i_Width; Bitmap.Height := i_Height; Bitmap.Canvas.CopyRect(BitmapRect, Application.MainForm.Canvas, BitmapRect); //nur für den Thread - eigentlich steht zum Speichern noch etwas mehr Code dahinter Bitmap.SaveToFile(Pfad + 'Bild.jpg'); finally //Bitmap löschen und freigeben FreeAndNil(Bitmap); end; end; |
AW: Screenshot vom Clientbereich der Mainform machen
Wenn du das Formular der Funktion übergeben würdest wär's gleich doppelt so nützlich:
Delphi-Quellcode:
procedure ScreenShot_erstellen(form:TCustomForm; const bitmapfilename: String);
|
AW: Screenshot vom Clientbereich der Mainform machen
TForm hat übrigens bereits eine Methode um den Client-Bereich als Bitmap zurückzuliefern:
![]() |
AW: Screenshot vom Clientbereich der Mainform machen
Zitat:
nach so was hab ich gesucht :-) Nur dummerweise scheint das was nicht richtig freigegeben zu werden. Ich erhalte von FastMM folgende Fehlermeldung am Ende vom Programm: Zitat:
Delphi-Quellcode:
(ja ich weiss, da fehlt ein try/finally-Block! - ist nur Test)
procedure TForm1.Button1Click(Sender: TObject);
var Jpg: TJPEGImage; begin Jpg := TJPEGImage.Create; Jpg.Assign(Form1.GetFormImage); Jpg.CompressionQuality := 100; Jpg.ProgressiveEncoding := false; Jpg.SaveToFile('D:\test.jpg'); FreeAndNil(Jpg); end; |
AW: Screenshot vom Clientbereich der Mainform machen
In GetFormImage wird ein Bitmap erzeugt (der Rückgabewert)
Delphi-Quellcode:
var
Jpg: TJPEGImage; BMP:TBitmap; begin Jpg := TJPEGImage.Create; BMP:=Form1.GetFormImage; Jpg.Assign(BMP); BMP.Free; ...... ...... |
AW: Screenshot vom Clientbereich der Mainform machen
Mann häts sich halt mal den Quellcode anschauen sollen :wall: - Danke, Bummi!
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Jpg: TJPEGImage; BMP:TBitmap; begin Jpg := TJPEGImage.Create; try BMP:=Form1.GetFormImage; Jpg.Assign(BMP); Jpg.SaveToFile('D:\test.jpg'); finally BMP.Free; Jpg.Free; end; end; |
AW: Screenshot vom Clientbereich der Mainform machen
Und so etwas ist genau der Grund, weshalb man in Funktionen keine Objekte zurückgeben sollte, die man innerhalb der Funktion erstellt.
|
AW: Screenshot vom Clientbereich der Mainform machen
Zitat:
Ich nutz für so was die out Variablen |
AW: Screenshot vom Clientbereich der Mainform machen
Es ist aber egal ob Rückgabewert oder Out-Parameter
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 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