Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sreenshot von transparenten Formularen (https://www.delphipraxis.net/72378-sreenshot-von-transparenten-formularen.html)

mlspider 29. Jun 2006 11:53


Sreenshot von transparenten Formularen
 
Hallo,

mein kleines Programm beinhaltet ein Formular, dass die Eigenschaft TransparentColor den Zustand Wahr hat. Nun möchte ich ein Schnappschuß des eben genannten machen.

Delphi-Quellcode:
procedure TForm1.ScreenToFile(aFileName: string);
var
  Bitmap: TBitmap;
  JPG : TJPEGImage;
  Canvas: TCanvas;
begin
  Canvas := TCanvas.Create;
  try
    Canvas.Handle := GetWindowDC(0);
    Application.ProcessMessages;
    try
      Bitmap := TBitmap.Create;
      Application.ProcessMessages;
      JPG := TJPEGImage.Create;
      Bitmap.PixelFormat:=pf8bit;
       Application.ProcessMessages;
      try
        Bitmap.Width := Screen.DesktopWidth;
        Bitmap.Height:= Screen.DesktopHeight;
        Bitmap.PixelFormat := pfDevice;
         Application.ProcessMessages;
        BitBlt(Bitmap.Canvas.Handle, 0, 0, Pred(Screen.DesktopWidth), Pred(
        Screen.DesktopHeight), Canvas.Handle, Screen.DesktopLeft,
        Screen.DesktopTop, Bitmap.Canvas.CopyMode);
        Application.ProcessMessages;
//Kompression
        JPG.CompressionQuality:=50;
        JPG.Assign(Bitmap);
        Application.ProcessMessages;
        if fileexists(aFileName) then
          deletefile(aFileName);
        JPG.SaveToFile(aFileName);
      finally
//Größe
       //resizepictur(aFileName,300,300);
        Bitmap.Free;
        JPG.Free;
      end;
    finally
      ReleaseDC(0, Canvas.Handle);
      Application.ProcessMessages;
    end;
  finally
    Canvas.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ScreenToFile('Screen1.jpg');
end;
Lichtet mir nur den Desktop ab. Das Form leider nicht.

xaromz 29. Jun 2006 15:02

Re: Sreenshot von transparenten Formularen
 
Hallo,

ich weiß zwar nicht, warum Dein Fenster nicht angezeigt wird, habe aber ein paar Anmerkungen zum Quelltext:
  • Du verwendest in dem kurzen Stück 7(!) mal Application.ProcessMessages. Wozu?
  • Du legst ein TCanvas-Objekt an, ohne es zu verwenden oder überhaupt zu benötigen
  • Du stellst erst das Pixelformat ein, um es nach der Größenanpassung wieder zu ändern. Am Besten ist folgende Reihenfolge: 1. Pixelformat, 2. Bildbreite, 3. Bildhöhe. Wobei die Reihenfolge von 2. und 3. nur etwas bringt, wenn der Speichermanager mitspielt.
Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 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