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
Version imprimable
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é
Salut Pasqualini
Tire de l'aide en ligne
Si je ne me trompe pasCitation:
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).
convertir un fichier WMF en Bitmap
BMP vers WMFCode:
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:
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; }
Je vous remercie pour ces réponses.
Je vais essayer.
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'imprimanteCode:
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'imprimerCode:
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:
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.
Je suis tres contant pour toi :ccool: