Метафайлы (GDI+)

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

GDI+ может отображать метафайлы, хранящиеся в следующих форматах:

  • Формат метафайла Windows (WMF)
  • EMF (Enhanced Metafile —расширенный метафайл)
  • EMF+

GDI+ может записывать метафайлы в форматах EMF и EMF+, но не в формате WMF.

EMF+ — это расширение для EMF, позволяющее хранить записи GDI+. Существует два варианта формата EMF+: EMF+ Only и EMF+ Dual. Метафайлы EMF+ Only содержат только записи GDI+. Такие метафайлы могут отображаться с помощью GDI+, но не с помощью интерфейса графических устройств Windows (GDI). Метафайлы EMF+ Dual содержат записи GDI+ и GDI. Каждая запись GDI+ в метафайле EMF+ Dual связана с альтернативной записью GDI. Такие метафайлы можно отобразить в GDI+ или GDI.

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

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;

Как показано в предыдущем примере, класс Graphics является ключом к записи инструкций и параметров в объекте Metafile . Любой вызов метода объекта Graphics можно записать в объект Metafile . Аналогичным образом можно задать любое свойство объекта Graphics и записать его в объект Metafile . Запись заканчивается, когда объект Graphics удаляется или выходит из область.

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

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

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

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;

В следующем примере показан образ метафайла, созданный в предыдущем примере.

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

На следующем рисунке показаны выходные данные предыдущего кода. Обратите внимание на сглаживание, эллиптическую область отсечения и поворот на 30 градусов.

Снимок экрана: окно, содержащее эллипс, заполненный линиями, происходящими в точке за пределами эллипса