IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Faire une copie d'écran d'un Panel [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Faire une copie d'écran d'un Panel
    Bonjour,
    Je voudrais faire une copie d'écran d'un Panel de ma Form afin de sauvegarder sous forme Bmp.
    J'ai vu cette discussion qui fonctionne sous Delphi :
    https://www.developpez.net/forums/d6...ecran-d-panel/
    J'ai utilisé la solution de dd16 mais j'obtiens une image noire.
    Dont voici le code très légèrement modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    procedure TForm1.Button3Click(Sender: TObject);
    var bmp:Graphics.Tbitmap;
        HDC_Panel:HDC;
        area:Trect;
        Canvas_tmp:TCanvas;
    begin
         HDC_panel:=GetWindowDC(panel1.handle);
         bmp:=Graphics.TBitmap.Create;
         Canvas_tmp:=TCanvas.create;
         Canvas_tmp.Handle:=HDC_Panel;
         bmp.width:=panel1.width;   // dimension du bitmap = dimension du panel
         bmp.height:=panel1.height;
         area.Bottom:=0;
         area.Top:=0;
         area.Width:=panel1.width;
         area.Height:=panel1.height;
     
         // copy du fond windows
         bmp.canvas.copyrect(area,Canvas_tmp,area);
         ReleaseDC(Canvas_tmp.handle,HDC_Panel);
         // le bitmap bmp contient le resultat
         // ici, je le copie sur un Timage de la meme taille pour verifier que ca marche
         image1.picture.assign(bmp);
         bmp.free;
         Canvas_tmp.free;
    end;
    Après plusieurs essais notamment d'utiliser ".Canvas.Changed" trouver dans certaine discussion rien ni fait. Je comprends pas.



    Merci pour votre aide.

    Windows 10 64 bit
    Lazarus version 1.8.2 64bit

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 950
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 950
    Points : 9 279
    Points
    9 279
    Par défaut
    hello,
    tu peux essayer avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    procedure Tform1.Button4Click(Sender: TObject);
    var
      lRect: TRect;
      lFormBitmap: TBitmap;
    begin
      lRect := Panel1.ReadBounds;
      lFormBitmap := TBitmap.Create;
      try
        lFormBitmap.Width := ClientWidth;
        lFormBitmap.Height := ClientHeight;
        lFormBitmap.Canvas.CopyRect(lRect, Canvas, lRect);
        lFormBitmap.SaveToFile('output.bmp');
      finally
        lFormBitmap.Free;
      end;
    end;
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Merci, ça m'aide bien.
    Tel quel j'obtient une copie de la Form, en modifiant la ligne 11 j'ai bien une copie du Panel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    procedure TForm1.Button3Click(Sender: TObject);
    var
      lRect: TRect;
      lFormBitmap: Graphics.TBitmap;
    begin
      lRect := Panel1.ReadBounds;
      lFormBitmap := Graphics.TBitmap.Create;
      try
        lFormBitmap.Width := ClientWidth;
        lFormBitmap.Height := ClientHeight;
        lFormBitmap.Canvas.CopyRect(lRect, Panel1.Canvas, lRect);
        lFormBitmap.SaveToFile('output.bmp');
      finally
        lFormBitmap.Free;
      end;
    end;
    Petit problème :
    Mon panel se trouve dans une ScrollBox en faisant ainsi je n'obtient que la partie visible du Panel (le reste est en noir) .
    Est-il possible de faire une copie total du Panel incluant la partie cachée?

  4. #4
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par angel_f Voir le message
    Merci, ça m'aide bien.
    ...
    Petit problème :
    Mon panel se trouve dans une ScrollBox en faisant ainsi je n'obtient que la partie visible du Panel (le reste est en noir) .
    Est-il possible de faire une copie total du Panel incluant la partie cachée?
    Cela doit être être possible, essaye comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    procedure TForm1.Button3Click(Sender: TObject);
    var
      lRect: TRect;
      lFormBitmap: Graphics.TBitmap;
    begin
      lRect := Panel1.ClientRect;
      lFormBitmap := Graphics.TBitmap.Create;
      try
        lFormBitmap.Width := Panel1.ClientWidth;
        lFormBitmap.Height := Panel1.ClientHeight;
        lFormBitmap.Canvas.CopyRect( Rect(0,0,lFormBitmap.Width-1,lFormBitmap.Height-1), Panel1.Canvas,lRect);
        lFormBitmap.SaveToFile('output.bmp');
      finally
        lFormBitmap.Free;
      end;
    end;
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Idem. Seule la partie visible est copiée le reste est en noir.
    Je ne pense pas que cela vienne de la définition des limites. Le bitmap a les même dimensions que le panel.

    Les 2 exemples me donnent le même résultat, le même bitmap.
    Je viens de remarquer quelque chose :
    Dans le bitmap les Scrollbars sont copiées (ce qui ne devait pas). C'est comme si l'on avait une copie de l'extérieur de la Scrollbox (elle-même en fait) au lieu de l'intérieur de celle-ci.

    Heuu, je suis pas sûr d'être très clair...

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Je vais peut-être dire une bêtise, mais je ne vois pas pourquoi la partie non visible de ton panel serait dessinée en mémoire : àmha, l'os ne calcule que ce qu'il doit afficher, et pas le reste.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #7
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Je vais peut-être dire une bêtise, mais je ne vois pas pourquoi la partie non visible de ton panel serait dessinée en mémoire : àmha, l'os ne calcule que ce qu'il doit afficher, et pas le reste.
    Tu as raison. Impossible de faire une capture de ce qui n'est pas affiché. J'ai essayé comme ceci également. Même combat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    uses 
      lclintf, lcltype;
     
    var
      PanelHandle : THandle; 
     
    panelHandle := GetDC(panelHandle.Handle);
    lFormBitmap.LoadFromDevice(panelHandle);
    ReleaseDC(panelHandle.Handle, panelHandle);
    lFormBitmap.SaveToFile('output.bmp');
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  8. #8
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 950
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 950
    Points : 9 279
    Points
    9 279
    Par défaut
    hello,
    une solution du genre bidouille consiste à ajuster la taille de la Tscrollbox à la taille du Tpanel pendant la capture puis la remettre à sa taille originale. Pour que cela fonctionne il faut que la TForm ait une taille supérieure au Tpanel (sinon il faut aussi la retailler). Voici un exemple de code pour faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    procedure Tform1.Button4Click(Sender: TObject);
    var
      lRect: TRect;
      lFormBitmap: TBitmap;
      OriWidth,OriHeight : Integer;
    begin
      OriWidth := ScrollBox1.Width;
      OriHeight := ScrollBox1.Height;
      ScrollBox1.Width := Panel2.Width;
      ScrollBox1.Height := Panel2.Height;
      ScrollBox1.VertScrollBar.Visible := False;
      ScrollBox1.HorzScrollBar.Visible := False;
      ScrollBox1.Repaint;
      lRect := Panel2.ReadBounds;
      lFormBitmap := TBitmap.Create;
      try
        lFormBitmap.Width := Panel2.Width;
        lFormBitmap.Height := Panel2.Height;
        lFormBitmap.Canvas.CopyRect(lRect,Panel2.Canvas, lRect);
        ScrollBox1.Width := OriWidth;
        ScrollBox1.Height := OriHeight;
        ScrollBox1.HorzScrollBar.Visible := True;
        ScrollBox1.VertScrollBar.Visible := True;
        ScrollBox1.Repaint;
        lFormBitmap.SaveToFile('M:\output.bmp');
      finally
        lFormBitmap.Free;
      end;
    end;
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    J’ai testé ta solution, elle fonctionne.
    j’ai ancré la Tscrollbox sur la Tform, et je ne redimensionne que la Tform.
    Cela m’évite le test de savoir si la nouvelle taille de la Tscrollbox rentre dans la Tform.
    J’étais parti sur une solution qui consiste à faire plusieurs copies en bougeant les scrollbars, mais la tienne est plus simple.

    Merci à toi et à tout ceux qui ont participé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/05/2016, 17h45
  2. Se connecter à un site et faire une copie d'écran
    Par pratick dans le forum NodeJS
    Réponses: 7
    Dernier message: 28/02/2016, 22h11
  3. Comment faire une copie d'écran d'une page web ?
    Par benj63 dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/06/2013, 16h11
  4. Faire une copie d'écran en vba
    Par deubelte dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/10/2009, 12h10
  5. Faire une copie d'écran d'un Panel
    Par Wilco dans le forum Langage
    Réponses: 2
    Dernier message: 19/10/2005, 17h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo