Autor Beitrag
Rainer78
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mi 05.08.09 16:02 
Hallo zusammen,

ich habe hier ja schon einige Beispiele gefunden, wie man Screenshorts erstellen kann.

Ich habe aber folgendes Problem:

Ich möchte von einem Formular, welches noch nicht angezeigt wird (FormCreate wurde schon durchgeführt, aber es ist noch visible=false) einen Screenshot erzeugen. Dieses soll dann auf einem anderen Formular als "Vorschau" dargestellt werden.

Der Ablauf sollte wie folgt aussehen (ist nur sinngemäß):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
FormCreate von Form_CaptureMe
FormCreate von PreviewWindow
PreviewWindow.Show
------

procedure PreviewWindow.OnShow
  begin
  FormCaptureMe.SetButtons; // Checkboxen etc. mit Vorgabenwerte setzen
  CreateFormScreenShot(Form_CaptureMe, Image1);
  end;

procedure Image1.OnClick;
  begin
  FormCaptureMe.ShowModal;
  end;


In dem Vorschau-Bild sollte dann auch die Checkboxen etc. mit den Werten zu sehen sein, die per SetButtons gesetzt werden.

Gibt es einen Trick wie man so etwas gestallten kann ?

Gruß,

Rainer
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.08.09 21:42 
Das geht nicht, da die Pixel für ein unsichtbares Fenster nicht existieren. Es ist nicht so, dass die Fenster im Speicher übereinander liegen wie ein Stapel Blätter. Das hat den Grund, damit nicht der Zustand jedes Fensters im Speicher vorgehalten werden muss. Wird ein Fenster in den Vordergrund geholt, bekommt es die Nachricht WM_PAINT, damit es, wenn erforderlich, seinen Clientbereich entsprechend neu zeichnen kann.

Wenn ich mich recht erinnere, hatte Mircosoft überlegt dies in zukünftigen Versionen zu ändern, jetzt wo in der Regel meist genug Speicher zur Verfügung steht. Früher war dies eben nicht der Fall, so dass eben die oben beschribene Lösung implementiert wurde.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mi 05.08.09 22:06 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Das geht nicht, da die Pixel für ein unsichtbares Fenster nicht existieren. Es ist nicht so, dass die Fenster im Speicher übereinander liegen wie ein Stapel Blätter. Das hat den Grund, damit nicht der Zustand jedes Fensters im Speicher vorgehalten werden muss. Wird ein Fenster in den Vordergrund geholt, bekommt es die Nachricht WM_PAINT, damit es, wenn erforderlich, seinen Clientbereich entsprechend neu zeichnen kann...


Hallo,

eben weil das so ist, könnte man ja selbst so tun als ob man Windows wäre, einen kompatiblen DC einrichten und dem Fenster WM_PAINT schicken - der DC bzw. Canvas ist dann der Screenshot. Nur mal sone Idee, aber warum soll das nicht gehen. Ist natürlich kein reines Delphi.

Gruss Reinhard
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 05.08.09 22:10 
Ungetestet:
www.delphipraxis.net...highlight=screenshot

Ich meine eine Funktion in der DelpihPraxis gesehen zu haben die das immer machen kann (Selbst wenn das Fenster minimiert ist). Einfach mal googlen

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.08.09 22:23 
Das könnte natürlich gehen. Dann streiche ich mal den ersten Satz, der Rest stimmt aber.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 06.08.09 06:05 
Wobei man das dann auch unter allen Systemen testen muss, wenn man es hinbekommen hat. Denn genau in dieser Hinsicht hat sich viel getan, sowohl von XP zu Vista als auch von Vista zu Windows 7 (Stichwort Direct 2D, 2,5D Hardwarebeschleunigung, ...).

Unter anderem wird WM_PAINT deutlich weniger oft aufgerufen unter Windows 7. Was neben der 2,5D Hardwarebeschleunigung und Direct2D ein Grund für die deutlich performantere Oberfläche im Vergleich zu XP ist.
Rainer78 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Do 06.08.09 09:41 
Vielen Dank an alle.

Der Delphipraxis-Link hat mir geholfen.