Метафайлы являются примером другого способа представления графической информации - векторного. В растровом изображении каждой точке некоторой области (листа бумаги, экрана монитора) соответствует некоторое число, определяющее цвет этой точки. В векторной графики существует некоторый набор примитивов (прямых линий, кривых, прямоугольников, закрашенных областей, текста и т.п.), которые задаются непосредственно в виде записей. Например, для точки необходимо хранить две координаты (х и у), для линии – информацию о двух конечных точках линии, для окружности – координаты центра и радиус. Данные записи составляют содержимое метафайла.
При отображении метафайла на экране, поочередно выбираются записи, в которых содержатся имя графического примитива и его параметры. Для каждого типа примитива вызывается соответствующая функция GDI, которая и рисует примитив на основе его параметров.
Поскольку метафайл описывает изображение в терминах команд графического вывода, изображение может быть промасштабировано без потери разрешения. С битовыми образами это невозможно: при увеличении битового образа биты будут просто повторяться горизонтально или вертикально, при уменьшении – выбрасываться на основе какого-либо алгоритма.
Метафайлы могут быть преобразованы в битовый образ без потери информации. Обратное преобразование практически невозможно в общем случае.
Для создания метафайла сначала создается контекст метафайла:
HDC hdcmf;
hdcmf = CreateMetaFile(“name.wmf”);
где “name.wmf” – имя файла на диске. Если данный параметр функции равен NULL, то метафайл создается в памяти.
После этого, вы можете рисовать на контексте метафайла точно так же, как и на контексте любого другого устройства. Например,
LineTo(hdcmf,20,20,80,80);
Rectandle(hdcmf, 10,10,50,60);
После закрытия метафайла
HMETAFILE hmf;
hmf = CloseMetaFile(hdcmf);
его в любой момент можно проиграть на любом другом контексте:
PlayMetaFile(hdc,hmf);
После окончания работы с метафайлом, его необходимо удалить из памяти:
DeleteMeteFile(hmf);
Данная функция удаляет метафайл из памяти. Если же этот метафайл был создан на диске, то выполнение данной функции приведет к тому, что из памяти он удалится, а на диске останется. Прочитать метафайл с диска можно при помощи функции:
hmf=GetMetaFile(“name.wmf”);