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 :

[Lazarus] Dessin vectoriel ou MetaFileCanvas


Sujet :

Lazarus Pascal

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 4
    Points : 3
    Points
    3
    Par défaut [Lazarus] Dessin vectoriel ou MetaFileCanvas
    Bonjour,
    Voila un composant que j'utilise sous Delphi courament. Il permet de dessiner sur une fiche directement en mode 'vetoriel' et de sauvegarder ces images en *.emf ou de les copier et coller directement dans une autre application (ex: Word). Je peux ensuite modifier le texte et les couleurs directement avec le traitement de texte. Il ne s'agit pas de bitmap ou de fichier jpeg, car les éléments sont accéssibles par type, un rond, une ligne etc.
    Cette fonction ne marche pas sous Lazarus.
    Avez-vous une idée pour faire la même chose ( en gagnant la fonction multiplateforme).
    Peut-être metafilePict ?
    ou par Stream, que je ne sais pas utiliser.
    Merci.

  2. #2
    Membre éclairé

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Points : 773
    Points
    773
    Par défaut
    Tu n'as pas trouvé car il n'y a pas de composant suplémentaire à installer

    Essaie de placer sur une form un composant TPaintBox et un TBitButton...
    Essaie ce bout de 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
    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
    xcenter, ycenter : integer;
    begin
         PaintBox1.Canvas.Pen.Width := 1;
       PaintBox1.Canvas.Pen.Color:= clBlue;
       xcenter:=Trunc(PaintBox1.Width/2);
       ycenter:=Trunc(PaintBox1.Height/2);
       PaintBox1.Canvas.Ellipse(xcenter-30,ycenter-30,xcenter+65,ycenter+30);
       PaintBox1.Canvas.Pen.Color:= clRed;
       PaintBox1.Canvas.Rectangle(xcenter-80,ycenter-50,xcenter-10,ycenter-10);
       PaintBox1.Canvas.TextOut(xcenter-80,ycenter+50,'Voici un rectangle et une ellipse');
       Repaint;
    end;
    Voilà un rectangle rouge, une ellipse bleue et un texte dessinés à des positions précises.

    Je pense que la plupart des fonctions que tu recherches sont implémentées. Je ne te montre ici qu'une infime partie de ce que tu peux faire. Si tu as activé pendant l'installation l'aide à la saisie, tapes
    et lazarus te proposera dans un popup tout ce qui est disponible (propriétés, procedures et fonctions) pour ton canvas. Tu devrais y trouver ton bonheur.

    Ce qui n'est pas implémenté, mais qui peut l'etre (d'autant plus facilement si tu as accès au code source de ton composant delphi) c'est l'export du dessin vers un format défini.

    Bon développement

    Clandestino

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Dessin vectoriel et copier coller
    Merci,
    Mes ce composant ne fait rien de plus que la type TCanvas ne fait déjà.
    Tu peux faire la même chose directement sur la forme principale TForm1 par exemple qui posséde cette "proprerty" en héritage de TcustomForm.
    Voici avec ton exemple.
    PaintBox1.Canvas.Pen.Width := 1;
    PaintBox1.Canvas.Pen.Color:= clBlue;
    xcenter:=Trunc(PaintBox1.Width/2);
    ycenter:=Trunc(PaintBox1.Height/2);
    PaintBox1.Canvas.Ellipse(xcenter-30,ycenter-30,xcenter+65,ycenter+30);
    PaintBox1.Canvas.Pen.Color:= clRed;
    PaintBox1.Canvas.Rectangle(xcenter-80,ycenter-50,xcenter-10,ycenter-10);
    PaintBox1.Canvas.TextOut(xcenter-80,ycenter+50,'Voici un rectangle et une ellipse');
    PaintBox1.Canvas.Refresh;
    Form1.Canvas.Ellipse(xcenter-30,ycenter-30,xcenter+65,ycenter+30);
    Form1.Canvas.Pen.Color:= clRed;
    Form1.Canvas.Rectangle(xcenter-80,ycenter-50,xcenter-10,ycenter-10);
    Form1.Canvas.TextOut(xcenter-80,ycenter+50,'Voici un rectangle et une ellipse');
    Form1.Canvas.Refresh;
    Ce qui m'interesse le plus est de pouvoir faire un copier/coller de ce TCanvas.
    Je penche plus actuellement sur l'utilisation de SetClipboardData(CF_MetaFilePict...
    Mais comment mettre le TCanvas en mémoire?

  4. #4
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Bonjour,

    Lazarus n'accepte pas encore les métafichiers. Le format est complexe à gérer rien que sous Windows, c'est donc la gageure pour faire du code portable sur les autres plateformes.

    A un moment j'ai voulu ajouter le support des WMF à une unité personnelle, mais je me suis arrêté en route.

    Donc il n'y a pas 36 solutions : soit attendre que l'équipe de Lazarus sorte le support WMF, soit le faire soit-même. Se limiter à Windows serait déjà un bon début. Il faut regarder les API du GDI.

    Bonne chance...

    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  5. #5
    Membre éclairé

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Points : 773
    Points
    773
    Par défaut
    l'étude rapide du code source du composant (fourni par delphi 7 entreprise dans le fichier graphics.pas) montre que ce dernier utilise l'api windows pour encapsuler ce format de fichier...

    CreateEnhMetaFile te permet de créer un metafile et renvoi un dc dans lequel tu peux dessiner alègrement ....
    Puis tu detruis ton metafile avec un CloseEnhMetaFile.
    Rien de bien difficile à prioris...
    Lazarus gère déjà les imports de ces fonctions si tu ajoutes l'unit windows dans les uses... les imports sont déclarés dans unidef.inc

    J'ai écrit vite fait une procedure qui dessine un rectangle et une ellipse et enregistre ça sur le disque dur dans un fichier emf :
    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
    30
    31
    32
    33
    procedure TForm1.Button1Click(Sender: TObject);
    var
    h : hdc;
    r2 : lpRect;
    hmeta : hwnd;
    pen1 : hpen;
     
    begin
      setrect(r2,0,0,2000,2000);        // taille de l'image
      h:= CreateEnhMetaFile(
      0,                                // handle du DC
      'tempfile',                      // nom de fichier
      r2,                               //  rectangle
      'test'#0'version 1'#0#0           // description string
      );
      SetMapMode (h, MM_HIMETRIC);
      pen1 := createPen(PS_SOLID,1,clblue);
      // dessinons
      SelectObject(h, GetStockObject(GRAY_BRUSH));
      selectobject(h,pen1);
      ellipse(h,0,  0, 800, 1200);
      Rectangle(h,400,500,1000,1000);
     
     
      hmeta := closeenhmetafile(h);
      //copions le fichier
      CopyEnhMetaFile(hmeta,'c:\testmeta\1.emf');
      //supprimons les handles
      DeleteEnhMetaFile(hmeta);
      deleteobject(pen1);
      //supprimons le fichier temporaire :
      deletefile('tempfile');
    end;
    Bien sur ceci n'est qu'une ébauche créée à partir d'exemples de codes en c++ issus de la doc sur msdn... A toi de travailler le principe pour créer un objet qui réponde à tes besoins...

    Par contre réécrire celà pour Linux est un travail énorme, car il faut dans ce cas étudier le format emf et ecrire de toute pièce tout le travail qui est déjà maché par l'api Windows. Ce qui risque de rebuter nombre de programmeurs qui n'ont certainement pas envie de favoriser un format propriétaire microsoft dans un logiciel libre!
    Je m'attend plus a voir sortir ce type de composant avec un format ouvert comme le *.sxd d'openoffice...

    En espérant t'avoir aidé

    Clandestino

  6. #6
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Bonjour,

    Oui, sous Windows, ça se fait sans trop de souci
    C'est les autres plateformes le souci. Mais Linux comme Mac doivent permettre le tracé vectoriel. Le tout est de savoir quel format ils utilisent

    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Trés bien Merci.
    Mais, mes applications devraient aussi tourner sur d'autres systèmes Mac et Linux. Alors j'ai essayé l'exemple postscript, mais il ne marche pas sous windows! (je suis nul)
    J'essaie donc de me tourner vers son cousin eps, en fabriquant un composant qui trace à l'écran et enregistre les "ordres", lineto, moveto etc. dans un TMemo que je pourrais sauver sur fichier.
    Une question vient de suite est-il possible de mettre un fichier texte définissant une image (ps,eps...) dans le presse papier et de le copier en tant qu'image dans une autre application?
    Je sais c'est une solution bizarre, mais j'essaie tout.

Discussions similaires

  1. Librairie pour dessin vectoriel
    Par bouba dans le forum C++
    Réponses: 3
    Dernier message: 20/06/2006, 18h09
  2. Dessin vectoriel 2D : librairies, docs, etc.
    Par lio33 dans le forum MFC
    Réponses: 3
    Dernier message: 24/05/2006, 13h43
  3. Dessin vectoriel et PHP
    Par Pagan dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 15/05/2006, 22h32
  4. Dessin vectoriel avec Python
    Par cboudy dans le forum PyQt
    Réponses: 2
    Dernier message: 04/04/2006, 21h38
  5. Dessin vectoriel
    Par Speed41 dans le forum Langage
    Réponses: 6
    Dernier message: 16/08/2004, 07h57

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