AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Screenshot vom Clientbereich der Mainform machen

Screenshot vom Clientbereich der Mainform machen

Ein Thema von Helmi · begonnen am 1. Apr 2012 · letzter Beitrag vom 2. Apr 2012
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#1

Screenshot vom Clientbereich der Mainform machen

  Alt 1. Apr 2012, 15:06
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:
    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?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Screenshot vom Clientbereich der Mainform machen

  Alt 1. Apr 2012, 15:18
Wieso fallen mir nur immer die Lösungen ein, nachdem ich gepostet hab ...

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;
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Screenshot vom Clientbereich der Mainform machen

  Alt 1. Apr 2012, 16:47
Wenn du das Formular der Funktion übergeben würdest wär's gleich doppelt so nützlich:
procedure ScreenShot_erstellen(form:TCustomForm; const bitmapfilename: String);
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Screenshot vom Clientbereich der Mainform machen

  Alt 1. Apr 2012, 17:12
TForm hat übrigens bereits eine Methode um den Client-Bereich als Bitmap zurückzuliefern: Delphi-Referenz durchsuchenTForm.GetFormImage
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Screenshot vom Clientbereich der Mainform machen

  Alt 1. Apr 2012, 17:29
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)
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Screenshot vom Clientbereich der Mainform machen

  Alt 1. Apr 2012, 17:33
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;
  ......
  ......
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Screenshot vom Clientbereich der Mainform machen

  Alt 1. Apr 2012, 17:42
Mann häts sich halt mal den Quellcode anschauen sollen - 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;
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Screenshot vom Clientbereich der Mainform machen

  Alt 1. Apr 2012, 19:06
Und so etwas ist genau der Grund, weshalb man in Funktionen keine Objekte zurückgeben sollte, die man innerhalb der Funktion erstellt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#9

AW: Screenshot vom Clientbereich der Mainform machen

  Alt 1. Apr 2012, 19:07
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
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Screenshot vom Clientbereich der Mainform machen

  Alt 1. Apr 2012, 19:14
Es ist aber egal ob Rückgabewert oder Out-Parameter
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 Uhr.
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