Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Screenshot vom Clientbereich der Mainform machen (https://www.delphipraxis.net/167485-screenshot-vom-clientbereich-der-mainform-machen.html)

Helmi 1. Apr 2012 15:06

Screenshot vom Clientbereich der Mainform machen
 
Hallo,

ich nutze folgenden Code um von meiner MainForm einen ScreenShot zu erstellen:

Delphi-Quellcode:
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;
Nur würde ich gerne nur einen ScreenShot vom Client-Bereich zu machen. Also alles innerhalb der Ränder/Taskleiste.

Ich vermute ich muss die Nullen bei:
Delphi-Quellcode:
    BitmapRect := Rect(0, 0, WindowRect.Right - WindowRect.Left, WindowRect.Bottom - WindowRect.Top);
durch Startwerte ersetzen, die innerhalb des Fensters sind.
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?

Helmi 1. Apr 2012 15:18

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;

sx2008 1. Apr 2012 16:47

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);

Namenloser 1. Apr 2012 17:12

AW: Screenshot vom Clientbereich der Mainform machen
 
TForm hat übrigens bereits eine Methode um den Client-Bereich als Bitmap zurückzuliefern: Delphi-Referenz durchsuchenTForm.GetFormImage

Helmi 1. Apr 2012 17:29

AW: Screenshot vom Clientbereich der Mainform machen
 
Zitat:

Zitat von NamenLozer (Beitrag 1159710)
TForm hat übrigens bereits eine Methode um den Client-Bereich als Bitmap zurückzuliefern: Delphi-Referenz durchsuchenTForm.GetFormImage

Hallo,

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:

---------------------------
Project1.exe: Speicherleck entdeckt
---------------------------
Diese Anwendung hat Speicher-Lecks. Die kleineren Speicher-Lecks sind (ausschließlich von Zeigern registrierte Lecks):



21 - 28 bytes: TBrush x 1

29 - 36 bytes: TPen x 1, Unbekannt x 2

37 - 44 bytes: TFont x 1

61 - 68 bytes: TBitmap x 1

101 - 108 bytes: TBitmapCanvas x 1

117 - 124 bytes: TBitmapImage x 1

157 - 172 bytes: Unbekannt x 1



Hinweis: Um eine Protokolldatei zu erhalten, die Details über Speicherlecks enthält, aktivieren Sie die "{$ FullDebugMode}" und "{$ LogMemoryLeakDetailToFile}" Definitionen. Um die Speicherleckprüfung zu deaktivieren, deaktivieren sie die "{$ EnableMemoryLeakReporting} -Option".


---------------------------
OK
---------------------------
bei diesem Test-Code:

Delphi-Quellcode:
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;
(ja ich weiss, da fehlt ein try/finally-Block! - ist nur Test)

Bummi 1. Apr 2012 17:33

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;
  ......
  ......

Helmi 1. Apr 2012 17:42

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;

DeddyH 1. Apr 2012 19:06

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.

Helmi 1. Apr 2012 19:07

AW: Screenshot vom Clientbereich der Mainform machen
 
Zitat:

Zitat von DeddyH (Beitrag 1159723)
Und so etwas ist genau der Grund, weshalb man in Funktionen keine Objekte zurückgeben sollte, die man innerhalb der Funktion erstellt.

Stimmt!
Ich nutz für so was die out Variablen

mkinzler 1. Apr 2012 19:14

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 13:11 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz