![]() |
Screenshots von 2 übereinanderliegenden Forms
Hallo,
mittels dem nachfolgenden Code mach ich Screenshots von einer Form (MainForm):
Delphi-Quellcode:
funktioniert tadellos
procedure ScreenShot_erstellen(const Pfad: String);
function DateiName(Pfad, Name, Endung: String): String; var i: Integer; begin //Variablen vordefinieren Result := ''; i := 1; //Pfad mit einem Backslash enden lassen Pfad := IncludeTrailingPathDelimiter(Pfad); while true do begin //Dateinamen zusammenstellen Result := Pfad + Format('%s%.3d.%s', [Name, i, Endung]); //wenn Datei nicht vorhanden, dann Schleife beenden If not FileExists(Result) then break; inc(i); end; end; var Png : TPngImage; Bitmap : TBitmap; BitmapRect: TRect; i_Width : Integer; i_Height : Integer; begin //Bitmap erzeugen Bitmap := TBitmap.Create; //PNG erzeugen Png := TPngImage.Create; //Höhe und Breite des Client-Bereiches ermitteln i_Width := Application.MainForm.ClientWidth; i_Height := Application.MainForm.ClientHeight; try //prüfen ob der ScreenShot-Ordner besteht, wenn nicht, dann erstellen //wenn er nicht erstellt werden konnte, dann Log schreiben If not DirectoryExists(Pfad) then If not CreateDir(Pfad) then begin InfoLog(Format('ScreenShot: Pfad "%s" nicht vorhanden und konnte nicht erstellt werden!', [Pfad])); exit; end; //Rect des Clientbereiches definieren BitmapRect := Rect(0, 0, i_Width, i_Height); //Bitmap-Größe angeben Bitmap.Width := i_Width; Bitmap.Height := i_Height; //Bild-Bereich in Bitmap kopieren Bitmap.Canvas.CopyRect(BitmapRect, Application.MainForm.Canvas, BitmapRect); //Bitmap als PNG speichern Png.Assign(Bitmap); Png.CompressionLevel := 7; Png.SaveToFile(DateiName(Pfad, 'Bild', 'png')); finally //Bitmap löschen und freigeben FreeAndNil(Bitmap); //PNG löschen und freigeben FreeAndNil(Png); end; end; Nur über die MainForm setz ich noch eine 2. Form. Jetzt hätt ich gerne einen Screenshot von allem - also so wie ich es auf dem Bildschirm sehe die MainForm im Hintergrund und die andere Form darüber wie kann ich das am besten realisieren? |
AW: Screenshots von 2 übereinanderliegenden Forms
Mit Fensterrahmen?
|
AW: Screenshots von 2 übereinanderliegenden Forms
Zitat:
![]() aber ich bräuchts ohne Rahmen (jedenfalls von der MainForm) |
AW: Screenshots von 2 übereinanderliegenden Forms
Ohne Fensterrahmen des Unterfensters kann man das ganz einfach mit Copyrect machen.
Delphi-Quellcode:
Setzt voraus, dass das Unterfenster im Überfenster liegt. Wenn nicht, muss man das auch abfangen.
Temp := Point(Subform.Left + (SubForm.Width - SubForm.ClientWidth) div 2, Subform.Top + SubForm.Height - SubForm.ClientHeight - (SubForm.Width - SubForm.ClientWidth) div 2); // angenommen, das Fenster hat unten so viel Rahmen wie links und rechts
Bitmap.CopyRect(Rect(Temp.X, Temp.Y, Temp.X + SubForm.ClientWidth, Temp.Y + SubForm.ClientHeight), SubForm.Canvas, Rect(0, 0, SubForm.ClientWidth, SubForm.ClientHeight)); |
AW: Screenshots von 2 übereinanderliegenden Forms
so bekomm ich jetzt nur ein weisses Rechteck, in der Größe der MainForm und da drauf die 2. Form
vermutlich hab ich irgendwas falsch übernommen |
AW: Screenshots von 2 übereinanderliegenden Forms
Du musst das nach dem bestehenden CopyRect in deinen Quelltext einfügen (und den TPoint deklarieren natürlich). Wenn einfach nur das Bild der ersten Form fehlt, scheint das ja nicht ganz falsch zu sein so weit.
|
AW: Screenshots von 2 übereinanderliegenden Forms
Dank dir - jetzt hab ich beides drauf
nur die Position der 2. Form im Bitmap entspricht nicht der eigentlichen Position Das bekomm ich aber noch raus |
AW: Screenshots von 2 übereinanderliegenden Forms
bei mir schaut jetzt die Erweiterung für die 2. Form (MessageForm) so aus:
Delphi-Quellcode:
damit wird die 2. Form im Bitmap genau an die gleiche Stelle gesetzt, wie auch im Programm.
If MessageForm.Visible then
begin Rahmenbreite_MaskForm := (MaskForm.Width - MaskForm.ClientWidth) div 2; X := MessageForm.Left - (MaskForm.Left + Rahmenbreite_MaskForm); Y := MessageForm.Top - (MaskForm.Top + (MaskForm.Height - Rahmenbreite_MaskForm - MaskForm.ClientHeight)); DestRect := Rect(X, Y, X + MessageForm.ClientWidth, Y + MessageForm.ClientHeight); SourceRect := Rect(0, 0, MessageForm.ClientWidth, MessageForm.ClientHeight); Bitmap.Canvas.CopyRect(DestRect, MessageForm.Canvas, SourceRect); end; Dummerweise muss man etwas rumprogrammieren um die Höhe der Titelleiste der 1. Form (MaskForm) rauszubekommen
Code:
(Höhe Titelleiste = Form.Höhe - Rahmenbreite - Form.ClientHöhe)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 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