AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bild vom Fenster

Ein Thema von daniel8520 · begonnen am 7. Mai 2004 · letzter Beitrag vom 8. Mai 2004
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#11

Re: Bild vom Fenster

  Alt 7. Mai 2004, 21:04
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Sebastian Nintemann
(Gast)

n/a Beiträge
 
#12

Re: Bild vom Fenster

  Alt 7. Mai 2004, 21:11
@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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#13

Re: Bild vom Fenster

  Alt 7. Mai 2004, 22:02
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
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#14

Re: Bild vom Fenster

  Alt 7. Mai 2004, 22:58
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Bild vom Fenster

  Alt 7. Mai 2004, 23:14
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#16

Re: Bild vom Fenster

  Alt 8. Mai 2004, 16:50
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:33 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