Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Screenshot einer versteckten Form (oder so) (https://www.delphipraxis.net/153575-screenshot-einer-versteckten-form-oder-so.html)

ralfiii 9. Aug 2010 11:13

Screenshot einer versteckten Form (oder so)
 
Gibt's eine Möglichkeit einem Formular zu sagen es soll sich doch mal auf ein bestimmtes Canvas zeichnen?

Hintergrund: Ich möchte Fenster gleitend einblenden, d.h. man drückt auf einen Button und der assoziierte Dialog (eine TForm) kommt mit einer Animation aus dem Button flüssig "rausgezoomt".
(Angelehnt an die Apple-Animation wenn man ein Explorer-Fenster öffnet indem man auf ein Festplatten-Symbol klickt - da vergrössert sich das Explorer-Fenster scheinbar aus dem Symbol heraus).

Um die Animation schön und flüssig aussehen zu lassen muss ich wissen wie das Fenster am Ende aussieht. Dynamisches Vergrössern des Formulars ist VIEL zu langsam, da wird die Animation lahm wenn mehr am Formular ist.

Ich hab bisher nur folgende Lösung gefunden:
Delphi-Quellcode:
        OffscreenXCoord:=GetMaxDesktopXPos; // 0..MonitorCount-1, max(Monitor[i].Left+Monitor.Width)
        Form2.Left:=OffscreenXCoord;
        Form2.Show;
        Form2.Repaint;
        CaptureFormGraphic(Form2, bmp); (GetWindowDC, bmp.Canvas.CopyRect)
        Form2.Hide;
        Form2.Left:=OriginalLeft;
        ...animation to Form2.BoundsRect...
        Form2.ShowModal;
Blöderweise stellt sich heraus, dass der Screenshot in dem Fall leer bleibt. Platziere ich das Formular zur Hälfte offscreen hab ich einen halben Screenshot und zur hälfte weisse Fläche.

Sende ich WM_ERASEBKGND und WM_PAINT ans Fenster, wird zwar der Hintergrund nicht aber die WinControls gezeichnet (und keine Ahnung ob das bei einem verstecktem Fenster überhaupt geht)

Also: geht das? (Wie) Kann ich einem Fenster sagen: "Zeichne dich mal hier drauf!"?
Oder sollte man solche Animationen generell anders erledigen?

Danke!!!

jfheins 9. Aug 2010 11:18

AW: Screenshot einer versteckten Form (oder so)
 
Hallo,
http://msdn.microsoft.com/en-us/libr...16(VS.85).aspx
könnte das sein was du suchst.
Sofern keine ActiveX Controls drauf sind, sollte das gehen.
habe ich übrigens so gefunden: http://www.google.de/search?q=windows+message+paint+dc Vielleicht ist da noch mehr hilfreiches ;)

MarcoWarm 9. Aug 2010 11:26

AW: Screenshot einer versteckten Form (oder so)
 
Mit folgender Routine kann man auch von unsichtbaren Formularen Screenshots erzeugen:

Delphi-Quellcode:
procedure PrintWindow(Wnd: HWND; ATo: TBitmap);
var
  hDCMem : HDC;
  DC    : HDC;
  rect  : TRect;
  bmp   : HBITMAP;
  hOld  : HGDIOBJ;
begin
  hDCMem:=CreateCompatibleDC(0);

  GetWindowRect(Wnd, rect);

  bmp:=0;

  DC:= GetDC(Wnd);
  bmp:= CreateCompatibleBitmap(DC, rect.Right-rect.Left, rect.Bottom-rect.Top);
  ReleaseDC(Wnd, DC);

  hOld:=SelectObject(hDCMem, bmp);
  SendMessage(wnd, wm_Print, hDCMem, PRF_CHILDREN or PRF_CLIENT or PRF_ERASEBKGND or PRF_NONCLIENT or PRF_OWNED);

  selectObject(hDCMem, hold);
  DeleteObject(hDCMem);

  ATo.FreeImage;
  ATo.Handle:=bmp;
end;
Quelle: http://code.google.com/p/theunknowno.../uSysTools.pas

ralfiii 9. Aug 2010 12:46

AW: Screenshot einer versteckten Form (oder so)
 
Zitat:

Zitat von MarcoWarm (Beitrag 1040441)
Mit folgender Routine kann man auch von unsichtbaren Formularen Screenshots erzeugen:
<Snip>

Genial, danke!


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