Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Screenshots von 2 übereinanderliegenden Forms (https://www.delphipraxis.net/183390-screenshots-von-2-uebereinanderliegenden-forms.html)

Helmi 6. Jan 2015 20:18


Screenshots von 2 übereinanderliegenden Forms
 
Hallo,

mittels dem nachfolgenden Code mach ich Screenshots von einer Form (MainForm):

Delphi-Quellcode:
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;
funktioniert tadellos

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?

Redeemer 6. Jan 2015 20:26

AW: Screenshots von 2 übereinanderliegenden Forms
 
Mit Fensterrahmen?

Helmi 6. Jan 2015 20:29

AW: Screenshots von 2 übereinanderliegenden Forms
 
Zitat:

Zitat von Redeemer (Beitrag 1285663)
Mit Fensterrahmen?

dafür hab ich grad diesen Code gefunden

aber ich bräuchts ohne Rahmen (jedenfalls von der MainForm)

Redeemer 6. Jan 2015 20:45

AW: Screenshots von 2 übereinanderliegenden Forms
 
Ohne Fensterrahmen des Unterfensters kann man das ganz einfach mit Copyrect machen.

Delphi-Quellcode:
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));
Setzt voraus, dass das Unterfenster im Überfenster liegt. Wenn nicht, muss man das auch abfangen.

Helmi 6. Jan 2015 20:57

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

Redeemer 6. Jan 2015 21:47

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.

Helmi 6. Jan 2015 21:54

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

Helmi 9. Jan 2015 20:08

AW: Screenshots von 2 übereinanderliegenden Forms
 
bei mir schaut jetzt die Erweiterung für die 2. Form (MessageForm) so aus:

Delphi-Quellcode:
    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;
damit wird die 2. Form im Bitmap genau an die gleiche Stelle gesetzt, wie auch im Programm.
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 16:38 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