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

C++Builder Discussion :

Dessin au format


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Par défaut Dessin au format
    Bonjour,
    lorsqu'on dessine avec C++ Builder en n'utilisant que des figures géométriques, segment de droite, cercles, ellipses, est-il possible de générer un dessin au format wmf ?

    Quelqu'un connait-il la réponse ?

    Merci

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    tu peux utiliser la Vcl.Graphics.TMetafile et la propriété Enhanced pour indiquer si cela doit utiliser EMF ou WMF

    Attention c'est EMF par GDI32 et non EMF par GDI+, le format doit être le même mais les possibilités et les performances doivent être très différentes !

    Pour WMF, je n'ai jamais vérifié ce qui était utilisé
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut Pasqualini
    Tire de l'aide en ligne
    La classe TMetafile encapsule les métafichiers évolués Win32.
    Unité
    Graphics
    Description
    TMetafile contient un graphique métafichier au format EMF.
    Les propriétés de TMetafile indiquent la taille et les caractéristiques du métafichier.
    Pour dessiner un métafichier dans le canevas, appelez la méthode Draw ou StretchDraw de l'objet TCanvas en lui transmettant comme paramètre un TMetafile. La propriété Enhanced détermine le mode de stockage du métafichier sur disque. Si Enhanced a la valeur true, le métafichier est stocké au format de fichier EMF (format évolué de métafichier spécifique à Win32). Si Enhanced a la valeur false, le métafichier est stocké au format WMF (métafichier Windows 3.1 avec un en-tête Aldus).
    Si je ne me trompe pas
    convertir un fichier WMF en Bitmap
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
    TMetafile *pMetafile = new TMetafile;
    pMetafile->LoadFromFile("C:\\Documents and Settings\\blondelle\\Mes documents\\ConversionImage\\arcarrow1.wmf"); // ou arcarrow1.emf
    Bitmap->Height = pMetafile->Height;
    Bitmap->Width = pMetafile->Width;
    Bitmap->Canvas->Draw(0, 0, pMetafile);
    Bitmap->SaveToFile("C:\\Documents and Settings\\blondelle\\Mes documents\\ConversionImage\\arcarrow2.bmp");
    delete Bitmap;
    delete pMetafile;
    }
    BMP vers WMF
    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
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
    Bitmap->LoadFromFile("C:\\Documents and Settings\\blondelle\\Mes documents\\ConversionImage\\arcarrow1.bmp");
     
    TMetafile *pMetafile = new TMetafile;
    pMetafile->Height = Bitmap->Height; // a placer imperativement sous TMetafile *pMetafile = new TMetafile;
    pMetafile->Width = Bitmap->Width; // idem a ce qui est ecrit ci dessus
     
    TMetafileCanvas *pCanvas = new TMetafileCanvas(pMetafile, Bitmap->Canvas->Handle); // Bitmap->Canvas->Handle
     
    pCanvas->Draw(0, 0, Bitmap);
    delete pCanvas;
    delete Bitmap;
    //PaintBox1->Canvas->Draw(0, 0, pMetafile); // juste pour visualiser si le passage se fait bien
     
    pMetafile->SaveToFile("C:\\Documents and Settings\\blondelle\\Mes documents\\ConversionImage\\arcarrow1.wmf"); // ou arcarrow1.emf
    delete pMetafile;
    }

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Par défaut
    Je vous remercie pour ces réponses.
    Je vais essayer.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Par défaut
    Après quelques tâtonnements, j'ai fini par arriver aux résultats que je cherchais.
    Si cela peut Intéresser d'autres personnes, voici les codes :


    Dessiner un Metafile et l'enregistrer
    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
     
    void __fastcall TfWMF::bDessinClick(TObject *Sender)
    {
      TMetafile *Metafile = new TMetafile();
      int largeur, hauteur;
      int xc, yc, R;
      largeur = 1200;
      hauteur = 800;
      xc = largeur/2;
      yc = hauteur/2;
      R = hauteur/4;
      // Création du canvas du metafile
      TMetafileCanvas* pcanvas = new TMetafileCanvas(Metafile, 0);
      Metafile->Enhanced = true;     // Format emf = Enhanced wmf
      Metafile->Width = largeur;
      Metafile->Height = hauteur;
      pcanvas->Draw(0, 0, Metafile);
      pcanvas->Pen->Color = clBlack;
      pcanvas->Brush->Style = bsClear;
      pcanvas->MoveTo(0, 0);
      pcanvas->LineTo(largeur, hauteur);
      pcanvas->MoveTo(largeur/2, hauteur/2);
      pcanvas->Ellipse(xc - R, yc - R, xc + R, yc + R);
      pcanvas->MoveTo(0, hauteur);
      pcanvas->LineTo(largeur, 0);
      delete pcanvas;   // Transfert le dessin dans le metafile
      Metafile->SaveToFile(L"Dessin-Cercle.emf");
     
      delete Metafile;
    }
    Créer un fichier metafile sur l'imprimante
    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
    34
    35
     
    void __fastcall TfWMF::bImprimanteClick(TObject *Sender)
    {
      TMetafile *Metafile = new TMetafile();
      Metafile->Enhanced = true;     // Format emf = Enhanced wmf
      int  largeur = GetDeviceCaps(Printer()->Handle, HORZRES) ;
      int  hauteur = GetDeviceCaps(Printer()->Handle, VERTRES);
      int xc = largeur/2;
      int yc = hauteur/2;
      int R = (largeur < hauteur ? largeur : hauteur);
      R = R/4;
      Metafile->Width = largeur;
      Metafile->Height = hauteur;
     
      TMetafileCanvas* pcanvas = new TMetafileCanvas(Metafile, 0);
      pcanvas->Pen->Color = clRed;
      pcanvas->Brush->Style = bsClear;
      pcanvas->MoveTo(0, 0);
      pcanvas->LineTo(largeur, hauteur);
     
      pcanvas->Pen->Color = clBlue;
      pcanvas->MoveTo(largeur/2, hauteur/2);
      pcanvas->Ellipse(xc - R, yc - R, xc + R, yc + R);
     
      pcanvas->Pen->Color = clBlack;
      pcanvas->MoveTo(0, hauteur);
      pcanvas->LineTo(largeur, 0);
      delete pcanvas;   // Transfert le dessin dans le metafile
     
      Printer()->BeginDoc();
      TRect r(0, 0, largeur, hauteur);
      Printer()->Canvas->StretchDraw(r, Metafile);
      Printer()->EndDoc();
      delete Metafile;
    }
    Lire un fichier *.wmf ou *.emf et l'imprimer
    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
    34
    35
    36
    37
    38
    39
    40
    41
     
    void __fastcall TfWMF::bWmfToImprimanteClick(TObject *Sender)
    {
      TMetafile *Metafile = new TMetafile();
      Metafile->Enhanced = true; // Enhanced Metafile
      UnicodeString usNom;
      int largeur, hauteur;
      int LargeurRec, HauteurRec;
      double k1, k2, k;
     
      // Lire le fichier Metafile
      if(!OpenPictureDialog1->Execute(Handle))  return;
      usNom = OpenPictureDialog1->FileName;
      Metafile->LoadFromFile(usNom);
      largeur = Metafile->Width;
      hauteur = Metafile->Height;
     
      TMetafileCanvas* pcanvas = new TMetafileCanvas(Metafile, 0);
      if(largeur < hauteur) Printer()->Orientation = poPortrait;
      else Printer()->Orientation = poLandscape;
     
      LargeurRec = GetDeviceCaps(Printer()->Handle, HORZRES);
      HauteurRec = GetDeviceCaps(Printer()->Handle, VERTRES);
     
      //Ajuster les dimension du rectangle pour conserver le rapport largeur/hauteur
      k1 = double(LargeurRec/double(largeur));
      k2 = double(HauteurRec/double(hauteur));
      k = (k1 < k2 ? k1 : k2);
      LargeurRec = k*largeur;
      HauteurRec = k*hauteur;
      TRect r(0, 0, LargeurRec, HauteurRec);
     
      // Imprimer le dessin
      Printer()->BeginDoc();
      Printer()->Canvas->StretchDraw(r, Metafile);
      Printer()->EndDoc();
     
      delete pcanvas;
      delete Metafile;
     
    }
    J'ai dessiné par ailleurs une fractale dans un metafile comportant plus de 2 millions de traits.
    Aucun problème.

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Je suis tres contant pour toi

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

Discussions similaires

  1. Dessiner une facture, format A4 et QPrinter
    Par sphax.wd dans le forum Qt
    Réponses: 2
    Dernier message: 25/02/2010, 09h41
  2. dessin et format des zones texte
    Par sorinexp dans le forum Access
    Réponses: 15
    Dernier message: 31/08/2005, 11h26
  3. lire une image au format RAW
    Par Anonymous dans le forum OpenGL
    Réponses: 5
    Dernier message: 20/05/2002, 00h11
  4. Réponses: 3
    Dernier message: 06/05/2002, 18h24

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