Sauvegarde une form sous forme d'image

Résolu
Signaler
Messages postés
49
Date d'inscription
jeudi 4 septembre 2008
Statut
Membre
Dernière intervention
31 janvier 2010
-
Messages postés
49
Date d'inscription
jeudi 4 septembre 2008
Statut
Membre
Dernière intervention
31 janvier 2010
-
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

Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
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 ="" />
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
Bonsoir,

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

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

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
Messages postés
49
Date d'inscription
jeudi 4 septembre 2008
Statut
Membre
Dernière intervention
31 janvier 2010

Bonsoir Guillemouze,

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

Ludovic
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
Il faut chercher un peu Ludo...

cantador
Messages postés
49
Date d'inscription
jeudi 4 septembre 2008
Statut
Membre
Dernière intervention
31 janvier 2010

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...
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Salut,




var  FormImage : TBitmap;
...
FormImage := GetFormImage;
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
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;
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
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="" />
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Ok.
J'avais mal compris la question, alors.
Désolé.
Messages postés
49
Date d'inscription
jeudi 4 septembre 2008
Statut
Membre
Dernière intervention
31 janvier 2010

Bonjour à tous,

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

Cordialement

Ludovic
Messages postés
49
Date d'inscription
jeudi 4 septembre 2008
Statut
Membre
Dernière intervention
31 janvier 2010

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