AGB  ·  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
Online

Registriert seit: 29. Dez 2003
Ort: München, Republik Bayern
2.918 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
Online

Registriert seit: 29. Dez 2003
Ort: München, Republik Bayern
2.918 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.240 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
Online

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.318 Beiträge
 
Turbo Delphi für Win32
 
#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
Online

Registriert seit: 29. Dez 2003
Ort: München, Republik Bayern
2.918 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.449 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
Online

Registriert seit: 29. Dez 2003
Ort: München, Republik Bayern
2.918 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
24.054 Beiträge
 
Delphi XE Professional
 
#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
Wenn Dein Programm nicht macht, was es soll, nenn es einfach "Version 1.0"

Delphi programming is cool
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi
Online

Registriert seit: 29. Dez 2003
Ort: München, Republik Bayern
2.918 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
34.942 Beiträge
 
Delphi XE2 Professional
 
#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 · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf