Метафайлы (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 градусов.