Métafichiers (GDI+)

Windows GDI+ fournit la classe Metafile afin que vous puissiez enregistrer et afficher des métafichiers. Un métafichier, également appelé image vectorielle, est une image stockée sous la forme d’une séquence de commandes de dessin et de paramètres. Les commandes et paramètres enregistrés dans un objet Metafile peuvent être stockés en mémoire ou enregistrés dans un fichier ou un flux.

GDI+ peut afficher les métafichiers qui ont été stockés dans les formats suivants :

  • Format de métafichier Windows (WMF)
  • métafichier amélioré (EMF)
  • EMF+

GDI+ peut enregistrer des métafichiers aux formats EMF et EMF+, mais pas au format WMF.

EMF+ est une extension d’EMF qui permet de stocker des enregistrements GDI+. Il existe deux variantes dans le format EMF+ : EMF+ Only et EMF+ Dual. EMF+ Seuls les métafichiers contiennent uniquement des enregistrements GDI+. Ces métafichiers peuvent être affichés par GDI+ mais pas par l’interface GDI (Windows Graphics Device Interface). Les métafichiers EMF+ double contiennent des enregistrements GDI+ et GDI. Chaque enregistrement GDI+ dans un métafichier EMF+ Double est associé à un autre enregistrement GDI. Ces métafichiers peuvent être affichés par GDI+ ou par GDI.

L’exemple suivant enregistre un paramètre et une commande de dessin dans un fichier disque. Notez que l’exemple crée un objet Graphics et que le constructeur de l’objet Graphics reçoit l’adresse d’un objet Metafile en tant qu’argument.

myMetafile = new Metafile(L"MyDiskFile.emf", hdc);
myGraphics = new Graphics(myMetafile);
   myPen = new Pen(Color(255, 0, 0, 200));
   myGraphics->SetSmoothingMode(SmoothingModeAntiAlias);
   myGraphics->DrawLine(myPen, 0, 0, 60, 40);
delete myGraphics;
delete myPen;
delete myMetafile;

Comme le montre l’exemple précédent, la classe Graphics est la clé de l’enregistrement des instructions et des paramètres dans un objet Metafile . Tout appel effectué à une méthode d’un objet Graphics peut être enregistré dans un objet Metafile . De même, vous pouvez définir n’importe quelle propriété d’un objet Graphics et enregistrer ce paramètre dans un objet Metafile . L’enregistrement se termine lorsque l’objet Graphics est supprimé ou sort de l’étendue.

L’exemple suivant affiche le métafichier créé dans l’exemple précédent. Le métafichier s’affiche avec son coin supérieur gauche à (100, 100).

Graphics myGraphics(hdc);
Image myImage(L"MyDiskFile.emf");
myGraphics.DrawImage(&myImage, 100, 100);

L’exemple suivant enregistre plusieurs paramètres de propriété (région de découpage, transformation du monde et mode lissage) dans un objet Metafile . Ensuite, le code enregistre plusieurs instructions de dessin. Les instructions et les paramètres sont enregistrés dans un fichier disque.

myMetafile = new Metafile(L"MyDiskFile2.emf", hdc); 
myGraphics = new Graphics(myMetafile);
   myGraphics->SetSmoothingMode(SmoothingModeAntiAlias);
   myGraphics->RotateTransform(30);

   // Create an elliptical clipping region.
   GraphicsPath myPath;
   myPath.AddEllipse(0, 0, 200, 100);
   Region myRegion(&myPath);
   myGraphics->SetClip(&myRegion);

   Pen myPen(Color(255, 0, 0, 255));
   myGraphics->DrawPath(&myPen, &myPath);

   for(INT j = 0; j <= 300; j += 10)
   {
      myGraphics->DrawLine(&myPen, 0, 0, 300 - j, j);
   }
delete myGraphics;
delete myMetafile;

L’exemple suivant affiche l’image de métafichier créée dans l’exemple précédent.

myGraphics = new Graphics(hdc);
myMetafile = new Metafile(L"MyDiskFile.emf");
myGraphics->DrawImage(myMetafile, 10, 10);

L’illustration suivante montre la sortie du code précédent. Notez l’anticrénelage, la zone de découpage elliptique et la rotation à 30 degrés.

capture d’écran d’une fenêtre qui contient une ellipse remplie de lignes provenant d’un point en dehors de l’ellipse