Gravando metarquivos

A classe Metafile , que herda da classe Image , permite que você registre uma sequência de comandos de desenho. Os comandos gravados podem ser armazenados na memória, salvos em um arquivo ou salvos em um fluxo. Os metarquivos podem conter elementos gráficos vetoriais, imagens de varredura e texto.

O exemplo a seguir cria um objeto Metafile . O código usa o objeto Metafile para registrar uma sequência de comandos gráficos e salva os comandos gravados em um arquivo chamado SampleMetafile.emf. Observe que o construtor Metafile recebe um identificador de contexto do dispositivo e o construtor Graphics recebe o endereço do objeto Metafile . A gravação é interrompida (e os comandos gravados são salvos no arquivo) quando o objeto Graphics sai do escopo. As duas últimas linhas de código exibem o metarquivo criando um novo objeto Graphics e passando o endereço do objeto Metafile para o método DrawImage desse objeto Graphics . Observe que o código usa o mesmo objeto Metafile para gravar e exibir (reproduzir) o meta-arquivo.

Metafile metafile(L"SampleMetafile.emf", hdc); 
{
   Graphics graphics(&metafile);
   Pen greenPen(Color(255, 0, 255, 0));
   SolidBrush solidBrush(Color(255, 0, 0, 255));

   // Add a rectangle and an ellipse to the metafile.
   graphics.DrawRectangle(&greenPen, Rect(50, 10, 25, 75));
   graphics.DrawEllipse(&greenPen, Rect(100, 10, 25, 75));

   // Add an ellipse (drawn with antialiasing) to the metafile.
   graphics.SetSmoothingMode(SmoothingModeHighQuality);
   graphics.DrawEllipse(&greenPen, Rect(150, 10, 25, 75));

   // Add some text (drawn with antialiasing) to the metafile.
   FontFamily fontFamily(L"Arial");
   Font font(&fontFamily, 24, FontStyleRegular, UnitPixel);
   
   graphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
   graphics.RotateTransform(30.0f);
   graphics.DrawString(L"Smooth Text", 11, &font, 
      PointF(50.0f, 50.0f), &solidBrush);
} // End of recording metafile.

// Play back the metafile.
Graphics playbackGraphics(hdc);
playbackGraphics.DrawImage(&metafile, 200, 100);

Observação

Para gravar um meta-arquivo, você deve construir um objeto Graphics com base em um objeto Metafile . A gravação do metarquivo termina quando o objeto Graphics é excluído ou sai do escopo.

 

Um metarquivo contém seu próprio estado gráfico, que é definido pelo objeto Graphics usado para registrar o metarquivo. Todas as propriedades do objeto Graphics (região de clipe, transformação do mundo, modo de suavização e similares) definidas durante a gravação do meta-arquivo serão armazenadas no metarquivo. Quando você exibir o metarquivo, o desenho será feito de acordo com essas propriedades armazenadas.

No exemplo a seguir, suponha que o modo de suavização tenha sido definido como SmoothingModeNormal durante a gravação do metarquivo. Embora o modo de suavização do objeto Graphics usado para reprodução esteja definido como SmoothingModeHighQuality, o metarquivo será reproduzido de acordo com a configuração SmoothingModeNormal. É o modo de suavização definido durante a gravação que é importante, não o modo de suavização definido antes da reprodução.

graphics.SetSmoothingMode(SmoothingModeHighQuality);
graphics.DrawImage(&meta, 0, 0);