Condividi tramite


Metafile (GDI+)

Windows GDI+ fornisce la classe Metafile in modo che sia possibile registrare e visualizzare metafile. Un metafile, chiamato anche immagine vettoriale, è un'immagine archiviata come sequenza di comandi e impostazioni di disegno. I comandi e le impostazioni registrati in un oggetto Metafile possono essere archiviati in memoria o salvati in un file o in un flusso.

GDI+ può visualizzare i metafile archiviati nei formati seguenti:

  • Formato metafile windows (WMF)
  • Enhanced Metafile (EMF)
  • EMF+

GDI+ può registrare metafile nei formati EMF e EMF+, ma non nel formato WMF.

EMF+ è un'estensione per EMF che consente la archiviazione dei record GDI+. Esistono due varianti sul formato EMF+: EMF+ Only e EMF+ Dual. EMF+ Solo i metafile contengono solo record GDI+. Tali metafile possono essere visualizzati da GDI+ ma non da Windows Graphics Device Interface (GDI). I metafile EMF+ Dual contengono record GDI+ e GDI. Ogni record GDI+ in un metafile EMF+ Dual è associato a un record GDI alternativo. Tali metafile possono essere visualizzati da GDI+ o da GDI.

L'esempio seguente registra un'impostazione e un comando di disegno in un file del disco. Si noti che l'esempio crea un oggetto Graphics e che il costruttore per l'oggetto Graphics riceve l'indirizzo di un oggetto Metafile come argomento.

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;

Come illustrato nell'esempio precedente, la classe Graphics è la chiave per registrare istruzioni e impostazioni in un oggetto Metafile . Qualsiasi chiamata effettuata a un metodo di un oggetto Graphics può essere registrata in un oggetto Metafile . Analogamente, è possibile impostare qualsiasi proprietà di un oggetto Graphics e registrare tale impostazione in un oggetto Metafile . La registrazione termina quando l'oggetto Graphics viene eliminato o esce dall'ambito.

Nell'esempio seguente viene visualizzato il metafile creato nell'esempio precedente. Il metafile viene visualizzato con l'angolo superiore sinistro in corrispondenza (100, 100).

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

Nell'esempio seguente vengono registrate diverse impostazioni delle proprietà (clipping region, world transformation e smoothing mode) in un oggetto Metafile . Il codice registra quindi diverse istruzioni di disegno. Le istruzioni e le impostazioni vengono salvate in un file del disco.

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;

Nell'esempio seguente viene visualizzata l'immagine metafile creata nell'esempio precedente.

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

La figura seguente mostra l'output del codice precedente. Si noti l'antialiasing, l'area di ritaglio ellittica e la rotazione a 30 gradi.

schermata di una finestra che contiene un'ellisse riempita con linee che provengono da un punto all'esterno dei puntini di sospensione