Запись метафайлов

Класс Metafile , который наследуется от класса Image , позволяет записывать последовательность команд рисования. Записанные команды могут храниться в памяти, сохраняться в файл или в потоке. Метафайлы могут содержать векторную графику, растровые изображения и текст.

В следующем примере создается объект Metafile . Код использует объект Metafile для записи последовательности графических команд, а затем сохраняет записанные команды в файл с именем SampleMetafile.emf. Обратите внимание, что конструктор Metafile получает дескриптор контекста устройства, а конструктор Graphics получает адрес объекта Metafile . Запись останавливается (а записанные команды сохраняются в файл) при выходе объекта Graphics из область. В последних двух строках кода метафайл отображается путем создания нового объекта Graphics и передачи адреса объекта Metafile методу DrawImage этого объекта Graphics . Обратите внимание, что код использует один и тот же объект Metafile для записи и отображения (воспроизведения) метафайла.

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);

Примечание

Чтобы записать метафайл, необходимо создать объект Graphics на основе объекта Metafile . Запись метафайла заканчивается, когда объект Graphics удаляется или выходит из область.

 

Метафайл содержит собственное графическое состояние, которое определяется объектом Graphics , используемым для записи метафайла. Все свойства графического объекта (область клипа, преобразование мира, режим сглаживания и т. п.), заданные при записи метафайла, будут храниться в метафайле. При отображении метафайла рисование выполняется в соответствии с хранимыми свойствами.

В следующем примере предположим, что во время записи метафайла для режима сглаживания было задано значение SmoothingModeNormal. Несмотря на то, что режим сглаживания объекта Graphics , используемого для воспроизведения, имеет значение SmoothingModeHighQuality, метафайл будет воспроизводиться в соответствии с параметром SmoothingModeNormal. Важно установить режим сглаживания во время записи, а не режим сглаживания, заданный перед воспроизведением.

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