Metadateien (GDI+)

Windows GDI+ stellt die Metafile-Klasse bereit, damit Sie Metadateien aufzeichnen und anzeigen können. Eine Metadatei wird auch als Vektorbild bezeichnet. Sie wird als eine Sequenz von Zeichnungsbefehlen und Einstellungen gespeichert. Die in einem Metafile-Objekt aufgezeichneten Befehle und Einstellungen können im Arbeitsspeicher oder in einer Datei oder einem Stream gespeichert werden.

Sie können mit GDI+ Metadateien anzeigen, die in den folgenden Formaten gespeichert wurden:

  • Windows Metafile Format (WMF)
  • Erweiterte Metadatei (Enhanced Metafile, EMF)
  • EMF+

GDI+ kann Metadateien in den Formaten EMF und EMF+ aufzeichnen, aber nicht im WMF-Format.

EMF+ ist eine Erweiterung von EMF, mit der die Aufzeichnungen von GDI+ gespeichert werden können. Es gibt zwei Varianten des EMF+-Formats: reines EMF+ und duales EMF+. Reine EMF+-Metadateien enthalten nur die GDI+-Aufzeichnungen. Solche Metadateien können von GDI+ angezeigt werden, aber nicht von windows Graphics Device Interface (GDI). Duale EMF+-Metadateien enthalten die Aufzeichnungen von GDI und GDI+. Jeder GDI+-Datensatz in einer dualen EMF+-Metadatei ist mit einem alternativen GDI-Eintrag gekoppelt. Diese Metadateien können von GDI+ und von GDI angezeigt werden.

Im folgenden Beispiel werden eine Einstellung und ein Zeichnungsbefehl in einer Datenträgerdatei aufgezeichnet. Beachten Sie, dass im Beispiel ein Graphics-Objekt erstellt wird und der Konstruktor für das Graphics-Objekt die Adresse eines Metafile-Objekts als Argument empfängt.

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;

Wie im vorherigen Beispiel gezeigt, ist die Graphics-Klasse der Schlüssel zum Aufzeichnen von Anweisungen und Einstellungen in einem Metafile-Objekt . Jeder Aufruf einer Methode eines Graphics-Objekts kann in einem Metafile-Objekt aufgezeichnet werden. Ebenso können Sie eine beliebige Eigenschaft eines Graphics-Objekts festlegen und diese Einstellung in einem Metafile-Objekt aufzeichnen. Die Aufzeichnung endet, wenn das Grafikobjekt gelöscht wird oder den Gültigkeitsbereich überschreitet.

Im folgenden Beispiel wird die im vorherigen Beispiel erstellte Metadatei angezeigt. Die Metadatei wird mit der linken oberen Ecke an Position (100, 100) angezeigt.

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

Im folgenden Beispiel werden mehrere Eigenschafteneinstellungen (Beschneidungsbereich, Welttransformation und Glättungsmodus) in einem Metafile-Objekt aufgezeichnet. Anschließend zeichnet der Code mehrere Zeichnungsanweisungen auf. Die Anweisungen und Einstellungen werden in einer Datenträgerdatei gespeichert.

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;

Im folgenden Beispiel wird das Metadateibild angezeigt, das im vorherigen Beispiel erstellt wurde.

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

Die folgende Abbildung zeigt die Ausgabe des vorangehenden Codes. Beachten Sie das Antialiasing, den elliptischen Clippingbereich und die Drehung um 30 Grad.

Screenshot eines Fensters, das eine Ellipse enthält, die mit Linien gefüllt ist, die an einem Punkt außerhalb der Ellipse stammen