Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bild vom Fenster (https://www.delphipraxis.net/21763-bild-vom-fenster.html)

Jens Schumann 7. Mai 2004 21:04

Re: Bild vom Fenster
 
Hallo,
das scheint jetzt aber zu funktionieren
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    ListBox1: TListBox;
    Edit1: TEdit;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  WindowDC : HDC;
begin
  // Verhindert dass das Bild bei mehrmaligem klicken immer kleiner wird ???
  Image1.Picture:=Nil;
  Application.ProcessMessages;
  // Verhindert dass das Bild bei mehrmaligem klicken immer kleiner wird ???
  // Warum weiss ich aber nicht
  Image1.Picture.Bitmap.Width:=Width;
  Image1.Picture.Bitmap.Height:=Height;
  WindowDC := GetWindowDC(Handle);
  Try
    BitBlt(Image1.Picture.Bitmap.Canvas.Handle,0,0,Width,Height,WindowDC,0,0,SRCCOPY);
    Image1.Invalidate;
  Finally
    ReleaseDC(Handle,WindowDC);
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var Lhwnd: HWND;
    LCanvas: TCanvas;
    LDest: Tbitmap;
begin
  LDest := TBitmap.Create;
  LDest.Width := width;
  LDest.Height := Height;
  Lhwnd := GetWindowDC(GetDesktopWindow);
  LCanvas := TCanvas.Create;
  LCanvas.Handle := Lhwnd;
  BitBlt(Ldest.Canvas.Handle, 0, 0, width, height, LCanvas.Handle, left, top, SRCCOPY);
  Image1.Picture.Assign(LDest);
  LCanvas.Free;
  ReleaseDC(GetDesktopWindow, Lhwnd);
  LDest.Free;
end;

end.

Sebastian Nintemann 7. Mai 2004 21:11

Re: Bild vom Fenster
 
@Jens Schumann
Ich glaube diese Merkwürdigkeiten bezüglich der Größe liegen daran, dass du ein Image verwendest. Ich hatte auch schonmal Schwierigkeiten damit, die Größe einer TImage-Komponente zur Laufzeit zu verändern.

Ich habs einfach mal so gemacht:
Delphi-Quellcode:
var
  dc: HDC;
  bmp: TBitmap;
begin
  dc := GetWindowDC(GetDesktopWindow);
  bmp := TBitmap.Create;
  try
    bmp.Width := Width;
    bmp.Height := Height;
    BitBlt(bmp.Canvas.Handle,0,0,Width,Height,dc,Left,Top,SRCCOPY);
    bmp.SaveToFile('C:\test.bmp');
  finally
    FreeAndNil(bmp);
    ReleaseDC(GetDesktopWindow,dc);
  end;
end;
Funktioniert wie erwartet :)
Danach kann man ja auch das Bitmap auf ein Image oder in eine PaintBox zeichnen. Von TImage lass ich die Finger wenn es nicht zur Anzeige eines feststehenden Bildes genutzt werden soll.

Viele Grüße, Sebastian

Muetze1 7. Mai 2004 22:02

Re: Bild vom Fenster
 
Moin!

Ab TWinControl gibt es die Methode PaintTo(), somit auch bei einem TForm, damit kann man die gesamte Form einfach mal schell in einem TBitmap zeichnen lassen...

MfG
Muetze1

Jens Schumann 7. Mai 2004 22:58

Re: Bild vom Fenster
 
Zitat:

Zitat von Muetze1
Moin!

Ab TWinControl gibt es die Methode PaintTo(), somit auch bei einem TForm, damit kann man die gesamte Form einfach mal schell in einem TBitmap zeichnen lassen...

MfG
Muetze1

Das ist richtig. Habe ich ja auch oben erwähnt. Die ursprüngliche Fragestellung war aber so zu verstehen, dass das komplette Fenster (incl. NonClientarea) kopiert werden sollte.
Das geht mit PaintTo nicht.

SirThornberry 7. Mai 2004 23:14

Re: Bild vom Fenster
 
Paint to geht nicht. Wenn man zum beispiel ein Panel hat und darin buttons so werden dei buttons nicht mit beachtet. Paint to kopiert einfach nur von der Canvas. Bei TSpinEdit sollte es ebenfalls fehl schlagen weil die Buttons auch extra Controls sind und nicht auf die Canvas des TSpinEdit gemalt werden. Wenn ich selbst komponenten baue sind diese sehr auf auch eine Art Container weil es einfach übersichtlicher ist wenn man in seinem Control Buttons plaziert als das man die gesamten klicks abfängt, auswertet, und die Buttons dann selbst auf die Canvas malt.

Muetze1 8. Mai 2004 16:50

Re: Bild vom Fenster
 
Moin!

Der wichtige Teil aus der TWinControl.PaintTo():
Delphi-Quellcode:
  Perform(WM_ERASEBKGND, DC, 0);
  Perform(WM_PAINT, DC, 0);
  if FWinControls <> nil then
    for I := 0 to FWinControls.Count - 1 do
      with TWinControl(FWinControls[I]) do
        if Visible then PaintTo(DC, Left, Top);
  RestoreDC(DC, SaveIndex);
Er fügt direkt den DC auf den gemalt werden soll (Parameter) zu der WM_PAINT hinzu, somit sollte alles gemalt werden. Auch der explizite Aufruf der WinControls sollte für die Childs greifen...

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 Uhr.
Seite 2 von 2     12   

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