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.