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
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
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
Salut Pasqualini
Tire de l'aide en ligne
Si je ne me trompe pasLa 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).
convertir un fichier WMF en Bitmap
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 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; }
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; }
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
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 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; }
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 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; }
J'ai dessiné par ailleurs une fractale dans un metafile comportant plus de 2 millions de traits.
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; }
Aucun problème.
Partager