Sauvegarde une form sous forme d'image

Résolu
ludo2223 Messages postés 49 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 31 janvier 2010 - 12 févr. 2009 à 11:37
ludo2223 Messages postés 49 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 31 janvier 2010 - 20 févr. 2009 à 09:34
Bonjour,

Voici mon problème. Je travaille sur une application qui permet de créer des documents multimédias et l'interface qui permet de placer les différents éléments (image, vidéo)
est une fenêtre Delphi.

Pour permettre à l'utilisateur d'avoir un aperçu de ses différentes créations j'ai besoin de créer une image à partir du contenu de cette fenêtre. Pour l'instant j'utilise la fonction "imprime écran" de windows mais ca pose problème si l'utilisateur met une fenêtre devant pile au mauvais moment.

Existe t-il une méthode qui permettrait d'obtenir le même résultat qu'un "Alt + impr écran" mais différemment ?
( une sorte de sérialisation de l'objet mais sous forme d'image)

Merci d'avance pour vos réponses.

Cordialement.

Ludovic Charollais

13 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
12 févr. 2009 à 21:27
Salut

pour obtenir une image d'une fiche partiellement caché ou en dehors de l'écran il faut proceder autrement:

"le code est juste fait pour montrer le principe "
  Private
    Procedure
GetWindowImage(aHandle: THandle);
    {
Déclarations privées }
  Public

    { Déclarations publiques }
  End;

Function PrintWindow(ahwnd:HWND; hdcBlt:HDC;
nFlags:UINT): Bool; Stdcall; External 'User32.dll'
name 'PrintWindow';
Var
  Form1: TForm1;

Implementation

Uses testwnd; { Fiche uniquement pour teser le code }

{$R *.dfm}

Procedure
TForm1.GetWindowImage(aHandle : THandle);
Var DC, hdcMem : HDC;
    aRect : TRect;

    hBMP : HBitmap;
    aWidth, aHeight : Integer;
    BMP :
TBitmap;
Begin
  dc :=
GetWindowDC(0);
   If  dc > 0 Then

  Try
    hdcMem : = CreateCompatibleDC(dc);
    If  hdcMem > 0  Then
    Try
      GetWindowRect(aHandle,
aRect);
      aWidth := aRect.Right-aRect.Left;
      aHeight :=
aRect.Bottom-aRect.Top;
      hBMP := CreateCompatibleBitmap(dc, aWidth,
aHeight);
       If  hBMP > 0 Then
      Try

        SelectObject(hdcMem, hBMP);

        PrintWindow(aHandle, hdcMem, 0);

        BMP : = TBitmap.Create;
        Try

          BMP.Width := aWidth;
          BMP.Height :=
aHeight;
          BitBlt(BMP.Canvas.Handle, 0,
0, aWidth, aHeight, hdcMem, 0, 0, srcCopy);

          Image1.Picture.Bitmap.Assign(BMP);
        Finally
          BMP.Free;
         End ;
      Finally

        DeleteObject(hBMP);
      End;
    Finally

      DeleteObject(hdcMem);
    End;
  Finally

    ReleaseDC(0, dc);
  End;
End;

Procedure TForm1.Button1Click(Sender:
TObject);
Begin

  GetWindowImage(testfrm.handle);
End;

voilà tout simplement

 
@+
Cirec

<hr siz ="" />
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 14
12 févr. 2009 à 15:57
Bonsoir,

Pourquoi ne pas mettre directement sur la forme un popup et sur clic droit
envoyer le forme dans le presse papier ?

cantador
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 7
12 févr. 2009 à 16:21
tu peux essayer TWinControl.PaintTo ou TWinControl.PaintWindow, mais il me semble que ca affiche aussi la fenetre qui se trouve devant. A verifier.
0
ludo2223 Messages postés 49 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 31 janvier 2010
12 févr. 2009 à 16:21
Bonsoir,

Merci pour votre réponse.

Votre solution me conviendrais mais comme fait on ?
( à la limite à la place du clic droit je le ferais juste avant de fermer la form comme ca quand l'utilisateur retourne sur l'interface principale l'aperçu est mis à jour. )

Quel serait le code de cette méthode, si vous avez des pistes de méthodes ou composants qui permettent de faire ca, je les testerais avec plaisir.

Merci

Ludovic
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ludo2223 Messages postés 49 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 31 janvier 2010
12 févr. 2009 à 16:23
Bonsoir Guillemouze,

Merci pour l'astuce, je le teste et je poste le résultat !

Ludovic
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 14
12 févr. 2009 à 16:30
Il faut chercher un peu Ludo...

cantador
0
ludo2223 Messages postés 49 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 31 janvier 2010
12 févr. 2009 à 17:28
Re bonsoir;

J'ai testé :
    - Form1.PaintTo(bmp.canvas.handle,0,0);
    - Form1.PaintWindow(bmp.canvas.handle);
    - Form1.PaintControls(bmp.canvas.handle,Self.Controls[0]);

mais je n'obtiens pas la totalité du contenu de la fenêtre. Par exemple le label y est mais pas le bouton.

Je continue mes recherches...
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 févr. 2009 à 18:53
Salut,




var  FormImage : TBitmap;
...
FormImage := GetFormImage;
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 févr. 2009 à 21:36
Salut Cirec,

Ma méthode fonctionne très bien pour une Form cachée, en dehors de l'écran, etc...

procedure TMainForm.Button1Click(Sender: TObject);
  var FormImage : TBitmap;
  begin
  FormImage := GetFormImage;
  try
    Image1.Picture.Bitmap.Assign(FormImage);
  finally FormImage.Free; end;
end;
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
12 févr. 2009 à 21:55
MDR

oui mais pas pour une fiche d'une application externe ... ben ça ne fonctionne pas
GetFormImage est une méthode de TCustomForm

function TCustomForm.GetFormImage: TBitmap;

et je suis désolé mais j'ai fait le teste avec sur la forme à capturer (1 TMemo avec texte; 1 TImage avec une image et 1 TBitButton avec un glyph) et une différence y est notable:
avec GetFormImage les ScrollBars de TMemo ne sont pas visible et la taille d'image n'est pas bonne du fait que barre de titre n'est pas prise en compte

alors qu'avec PrintWindow tout est bon

donc dans un cadre plus général il est préférable d'utiliser PrintWindow

 
@+
Cirec

<hr siz="" />
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 févr. 2009 à 22:15
Ok.
J'avais mal compris la question, alors.
Désolé.
0
ludo2223 Messages postés 49 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 31 janvier 2010
13 févr. 2009 à 09:35
Bonjour à tous,

Merci beaucoup pour votre aide. Je teste tout ca et je vous tiens au courant.

Cordialement

Ludovic
0
ludo2223 Messages postés 49 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 31 janvier 2010
20 févr. 2009 à 09:34
Bonjour à tous,

Voilà j'ai fait pas mal de tests avec la solution de Cirec et tout marche parfaitement.

Les deux autres solutions fonctionnent aussi mais ne couvrent pas tout les types de composants.

Merci beaucoup pour votre aide.

Ludovic
0