Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

4.11 Метафайлы

Метафайлы имеют такое же значение для векторной графики, как и битовые образы для растровой графики.

Метафайлы конструируются человеком или компьютерной программой. Метафайл состоит из набора записей, соответствующих вызовам графических функций, например, рисующих прямые линии, кривые, закрашенные области и текст. Таким образом, метафайл — набор вызовов графических функций, закодированный в двоичной форме.

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

Поскольку метафайл описывает изображение в терминах команд графического вывода, изображение может быть промасштабировано без потери разрешения. С битовыми образами это невозможно. Если вы отображаете битовый образ в увеличенном в два раза виде, то вы не получите двойного разрешения. Биты внутри битового образа будут просто повторяться горизонтально и вертикально.

Метафайл может быть преобразован в битовый образ без потери информации. Графические объекты, составляющие метафайл, теряют свою индивидуальность и соединяются вместе в одном большом образе.

Преобразование битового образа в метафайл — гораздо более сложная задача, решаемая обычно только для простых битовых образов, и требующая высокой мощности процессора для выявления углов и контуров.

Метафайлы чаще всего используются для разделения изображений между программами посредством буфера обмена, хотя они могут также быть сохранены на диске в виде файлов. Поскольку метафайлы описывают изображение как набор вызовов GDI, для их хранения требуется значительно меньше места, и они более независимы от устройства, чем битовые образы.

Сначала мы рассмотрим функции работы с метафайлами, которые поддерживаются Windows, начиная с версии 1.0, а затем остановимся на "расширенных метафайлах", разработанных для Windows NT. Расширенные метафайлы имеют серьезные преимущества в сравнении с метафайлами старого формата и значительно лучше приспособлены для дискового хранения.

4.11.1 Простое использование метафайлов памяти

Для создания метафайла сначала надо построить контекст устройства метафайла путем вызова функции CreateMetaFile. Затем вы можете использовать большинство функций рисования GDI в этом контексте метафайла. Эти вызовы функций GDI ничего не будут выводить на экран. Вместо этого они будут запоминаться в метафайле. Когда вы закроете контекст устройства метафайла, вы получите описатель метафайла. Затем, вы можете "проиграть" этот метафайл на реальном контексте устройства и выполнить функции GDI метафайла.

Функция CreateMetaFile имеет один параметр. Он может быть равен NULL или быть именем файла. Если NULL, то метафайл запоминается в оперативной памяти. Если указано имя файла (обычно с расширением .WMF — "Windows Metafile"), то метафайл запоминается как дисковый файл.

Программа METAFILE показывает, как создать метафайл в памяти во время обработки сообщения WM_CREATE и 100 раз вывести изображение во время обработки сообщения WM_PAINT.

Эта программа демонстрирует использование четырех функций метафайлов, работающих с метафайлом памяти. Первая функция — CreateMetaFile, вызванная с параметром NULL в теле обработчика сообщения WM_CREATE. Эта функция возвращает описатель контекста устройства метафайла. Затем программа METAFILE рисует прямоугольник, две прямые и один голубой эллипс, используя данный контекст устройства метафайла. Вызовы этих 4-х функций запоминаются в двоичной форме в метафайле. Функция CloseMetaFile возвращает описатель метафайла. Обратите внимание, что описатель метафайла запоминается в статической переменной, поскольку он используется позднее.

Метафайл содержит двоичное представление вызовов функций GDI — одного вызова Rectangle, двух вызовов MoveToEx, двух вызовов LineTo, вызова SelectObject (задающего голубую кисть) и вызова Ellipse. Режим отображения или преобразования не описывается координатами. Они просто запоминаются в метафайле в числовом виде.

Во время обработки сообщения WM_PAINT программа METAFILE устанавливает режим отображения и вызывает функцию PlayMetaFile для рисования объекта в окне 100 раз. Координаты вызовов функций в метафайле интерпретируются в соответствии с режимом отображения приемного контекста устройства. Вызывая PlayMetaFile, вы повторяете все вызовы функций, сделанные между вызовами функций CreateMetaFile и CloseMetaFile при первоначальном создании метафайла во время обработки сообщения WM_CREATE.

Как и другие объекты GDI, метафайлы должны быть тоже удалены до завершения программы. Процедура удаления реализуется в теле обработчика сообщения WM_DESTROY с помощью функции DeleteMetaFile.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]