![]() |
Bild vom Fenster
Hallo,
also ich wollte gern ein Bild von meinem eigenen Prog machen, aus dem Programm heraus. Nur soll dass nicht über die Kombination ALT+Print, sondern über einen Button o.ä. funktionieren. Also kurz: ich möchte in meinem Programm ein Bild von selbigem machen. Ich hab nun die Code-Lib durchsucht, aber nur funktionen gefunden, bei denen der ganze Bildschirm "fotografiert" wird. Ich muss aber ein Bild vom Prog - nur vom Prog - haben. Kann mir da jemand weiterhelfen? |
Re: Bild vom Fenster
funktioniert eignetlich genau so wie ein bild vom gesamten Bildschirm.
Du holst dir das Handle auf die Canvas vom Desktop und kopierst dann nur den Bereich wo dein Programm liegt.. |
Re: Bild vom Fenster
mach doch:
erst screenshoot, dann ausschneiden du kannst doch als eckpunkte die nehmen: links oben:___(_Form1.Left_______________|_Form1.Top_) rechts oben:__(_Form1.Left_+_Form1.width_|_Form1.Top_) links unten:__(_Form1.Left_______________|_Form1.Top_+_F orm1.heigth ) rechts unten:_(_Form1.Left_+_Form1.width_|_Form1.Top_+_Fo rm1.heigth ) kann dir leider nur nen tipp geben, da ich mit aus ner bitmap ausschneiden und so selber nit kann :-D von daher, das musst du dann machen ich hoffe das hilft trotzdem [Edit]Sch*** Leerzeichen-Killer[/Edit] [Edit]Sch*** Leerzeichen-Killer, nochmal[/Edit] |
Re: Bild vom Fenster
Hallo,
es funktioniert so:
Delphi-Quellcode:
Wenn Du nur den Clientbereich des Fensters brauchst reicht ein einfaches PaintTo.
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; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var WindowDC : HDC; _Canvas : TCanvas; begin Image1.Picture.Bitmap.Width:=Width; Image1.Picture.Bitmap.Height:=Height; WindowDC := GetWindowDC(Handle); _Canvas:=TCanvas.Create; Try _Canvas.Handle:=WindowDC; BitBlt(Image1.Picture.Bitmap.Canvas.Handle,0,0,Width,Height,_Canvas.Handle,0,0,SRCCOPY); Finally _Canvas.Free; ReleaseDC(Handle,WindowDC); end; end; end. |
Re: Bild vom Fenster
|
Re: Bild vom Fenster
So sollte es gehen (ging bei mir)
Delphi-Quellcode:
@Jens Schumann: War wohl bissl zu langsam, allerdings hast du nen Fehler drin. Du hast die Left,Top Position bei BitBlt nicht angegeben bzw. vorrausgesetzt das sich das fenster bei pixel Point(0,0) befindet
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; |
Re: Bild vom Fenster
Danke für eure Hilfe,
ich kann euch ja mal sagen, was ich vorhatte: ich wollte eigentlihc nur ein StringGrid ausdrucken. Aber das scheint ja nicht ganz so einfach zu sein. Also dachte ich mir, machste n' Form mit bsNone und der Gridgröße, und lässt das ausdrucken, soweit sogut. Nur, die Schriftqualität im Grid ist, naja sagen wir mal nicht wirklich schön. Dann dachte ich daran, ein Bild vom Form zu machen. Hab dann gepostet, und während ich gewartet hab, hab ich selbst mal ein Bild mit der Taste "Print Screen" gemacht, und das dann ausgedruckt. Sieht aber noch dümmer aus! Ich hab dann noch ne andere Schrift im Grid genommen. Hat aber alles nichts geholfen. Naja, muss ich mir wohl noch was anderes einfallen lassen. Oder mir ne function über den Druck von nem Grid besorgen, aber das ist dann ja wohl OT! Trotzdem danke für euren Einsatz! :dp: |
Re: Bild vom Fenster
Zitat:
Wenn ich mehrmals auf den Button klicke werden die Fenster immer kleiner (ich Stretch auf True). Der Effekt tritt mit Deinem Code auch auf. :gruebel: :gruebel: :gruebel: |
Re: Bild vom Fenster
@SirThornberry:
Delphi-Quellcode:
Wieso erstellst du denn ein Canvas (LCanvas), welches du garnicht benötigst? Das einzige mal wo LCanvas auftaucht ist im BitBlt als LCanvas.Handle, aber da könntest du doch gleich Lhwnd nehmen.
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; Viele Grüße, Sebastian |
Re: Bild vom Fenster
Zitat:
|
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. |
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:
Funktioniert wie erwartet :)
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; 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 |
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 |
Re: Bild vom Fenster
Zitat:
Das geht mit PaintTo nicht. |
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.
|
Re: Bild vom Fenster
Moin!
Der wichtige Teil aus der TWinControl.PaintTo():
Delphi-Quellcode:
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...
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); MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 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