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.