Metafiles (GDI+)

O Windows GDI+ fornece a classe Metafile para que você possa gravar e exibir metafiles. Um metarquivo, também chamado de uma imagem de vetor, é uma imagem que é armazenada como uma sequência de comandos e configurações de desenho. Os comandos e as configurações registrados em um objeto Metafile podem ser armazenados na memória ou salvos em um arquivo ou fluxo.

O GDI+ pode exibir metafiles que foram armazenados nos seguintes formatos:

  • Formato de Metarquivo do Windows (WMF)
  • EMF (Metarquivo Avançado)
  • EMF+

O GDI+ pode gravar metafiles nos formatos EMF e EMF+, mas não no formato WMF.

EMF+ é uma extensão para EMF que permite que registros GDI+ sejam armazenados. Há duas variações no formato EMF+: Apenas EMF+ e EMF+ Duplo. Somente os meta-arquivos em EMF+ contêm apenas registros GDI+. Esses metarquivos podem ser exibidos pelo GDI+, mas não pela GDI (Interface de Dispositivo de Gráficos do Windows). Os metarquivos duplos EMF+ contêm registros GDI+ e GDI. Cada registro GDI+ em um meta-arquivo DUAL EMF+ é emparelhado com um registro GDI alternativo. Esses meta-arquivos podem ser exibidos por GDI+ ou por GDI.

O exemplo a seguir registra uma configuração e um comando de desenho em um arquivo de disco. Observe que o exemplo cria um objeto Graphics e que o construtor do objeto Graphics recebe o endereço de um objeto Metafile como um 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 mostra o exemplo anterior, a classe Graphics é a chave para gravar instruções e configurações em um objeto Metafile . Qualquer chamada feita a um método de um objeto Graphics pode ser registrada em um objeto Metafile . Da mesma forma, você pode definir qualquer propriedade de um objeto Graphics e registrar essa configuração em um objeto Metafile . A gravação termina quando o objeto Graphics é excluído ou sai do escopo.

O exemplo a seguir exibe o metarquivo criado no exemplo anterior. O metarquivo é exibido com seu canto superior esquerdo em (100, 100).

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

O exemplo a seguir registra várias configurações de propriedade (região de recorte, transformação mundial e modo de suavização) em um objeto Metafile . Em seguida, o código registra várias instruções de desenho. As instruções e as configurações são salvas em um arquivo 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;

O exemplo a seguir exibe a imagem de metarquivo criada no exemplo anterior.

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

A ilustração a seguir mostra a saída do código anterior. Observe a suavização, a região de recorte elíptico e a rotação de 30 graus.

captura de tela de uma janela que contém uma elipse preenchida com linhas originadas em um ponto fora da elipse