Compartir a través de


Metarchivos (GDI+)

Windows GDI+ proporciona la clase Metafile para que pueda registrar y mostrar metarchivos. Un metarchivo, también denominado imagen vectorial, es una imagen que se almacena como una secuencia de comandos y valores de configuración de dibujo. Los comandos y la configuración registrados en un objeto Metarchivo se pueden almacenar en memoria o guardarse en un archivo o secuencia.

GDI+ puede mostrar metarchivos almacenados en los formatos siguientes:

  • Formato de metarchivo de Windows (WMF)
  • Metarchivo mejorado (EMF)
  • EMF+

GDI+ pueden registrar metarchivos en los formatos EMF y EMF+, pero no en el formato WMF.

EMF+ es una extensión de EMF que permite almacenar registros de GDI+. Hay dos variaciones en el formato EMF+: EMF+ Only y EMF+ Dual. Los metarchivos EMF+ Only solo contienen registros de GDI+. GDI+ puede mostrar estos metarchivos, pero no mediante la interfaz de dispositivo gráfico (GDI) de Windows. Los metarchivos EMF+ Dual contienen registros de GDI+ y GDI. Cada registro de GDI+ en un metarchivo EMF+ Dual se empareja con un registro de GDI alternativo. Estos metarchivos los puede mostrar GDI+ o GDI.

En el ejemplo siguiente se registra una configuración y un comando de dibujo en un archivo de disco. Tenga en cuenta que el ejemplo crea un objeto Graphics y que el constructor del objeto Graphics recibe la dirección de un objeto Metafile como argumento.

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;

Como se muestra en el ejemplo anterior, la clase Graphics es la clave para registrar instrucciones y configuraciones en un objeto Metafile . Cualquier llamada realizada a un método de un objeto Graphics se puede registrar en un objeto Metafile . Del mismo modo, puede establecer cualquier propiedad de un objeto Graphics y registrar ese valor en un objeto Metafile . La grabación finaliza cuando se elimina el objeto Graphics o sale del ámbito.

En el ejemplo siguiente se muestra el metarchivo creado en el ejemplo anterior. El metarchivo se muestra con la esquina superior izquierda en (100, 100).

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

En el ejemplo siguiente se registran varias configuraciones de propiedad (región de recorte, transformación mundial y modo de suavizado) en un objeto Metafile . A continuación, el código registra varias instrucciones de dibujo. Las instrucciones y la configuración se guardan en un archivo de 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;

En el ejemplo siguiente se muestra la imagen de metarchivo creada en el ejemplo anterior.

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

En la ilustración siguiente se muestra la salida del código anterior. Tenga en cuenta el suavizado de contorno, la región de recorte elíptico y la rotación de 30 grados.

captura de pantalla de una ventana que contiene una elipse llena de líneas que se originan en un punto fuera de la elipse