Прототип к варианту 16 - МикроГраф, страница 3

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

Рисование текущего объекта в графическом поле Index = 0 - кнопка Execute рисует текущий объект в большом поле Picturel

Index = 1 - кнопка SmallView рисует текущий объект в малом поле Picture2

Index = 2 - кнопка AddToMF.добавляет текущий объект в метафайл.

Процедура CmdShowMF_Click воспроизводит метафайл в элементе Picture!.. В процессе переноса пришлось перейти к расширенным версиям функций изменения габаритов логического окна и области просмотра (SetWindowExtExt вместо SetWindowExt), чтобы программный код мог использоваться на 16- и 32-разрядных версиях без дополнительного применения условной компиляции. Метафайл можно воспроизводить прямо в Picturel, поскольку координаты записаны в том же режиме отображения и с тем же размером логического окна, как и при воспроизведении. Чтобы масштабировать метафайл для вывода в малом графическом поле, необходимо задать режим отображения, габариты окна и области просмотра.

Команда Metafile t Copy to C1 ipboard копирует текущий метафайл в буфер обмена. Для этого она должна загрузить структуру METAFILEPICT.

Хотя в буфер можно скопировать текущий объект метафайла, это не принесет особой пользы, поскольку координаты жестко зафиксированы в метафайле. Метафайл в буфере должен быть масштабируемым. Кроме того, метафайл необходимо скопировать, поскольку после помещения

метафайла в буфер его манипулятор не может использоваться приложением. Решение заключается в том, чтобы создать новый метафайл и задать габариты логического окна в соответствии с размерами элемента Picturel. Затем существующий метафайл воспроизводится в новом метафайле, после чего новый метафайл закрывается. В структуру METAFILEPICT заносится нужный режим отображения и габариты метафайла. Для хранения структуры METAFILEPICT выделяется глобальный блок памяти. Структура копируется в выделенный блок функцией agCopyData.

Блоки памяти и методы работы с ними упоминаются в главе 9 и подробно рассматриваются в главе 15. Буфер обмена используется следующим образом: мы открываем буфер, стираем его текущее содержимое, заносим новые данные и затем закрываем буфер. Объект метафайла, созданный в процессе копирования, теперь принадлежит буферу обмена и не может удаляться приложением.

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

Загрузка метафайла делится на два этапа. Сначала необходимо определить, хранится ли в выбранном файле размещаемый метафайл. Для этого мы читаем первые 22 байта файла в структуру METAFILEHEADER. Специальное ключевое поле в структуре является признаком заголовка размещаемого метафайла. Если проверка дает отрицательный результат, программа возвращается к началу файла для чтения неразмещаемого метафайла. Выделяется глобальный блок памяти, объем которого достаточен для хранения всего файла. Функция GlobalLock возвращает адрес этого блока в памяти, затем функция hread загружает весь файл в блок. В Win32 не существует различий между hread и Iread; на самом деле рекомендуется использовать другие процедуры ввода/вывода, описанные в главе 13. Тем не менее в Winl6 hread может читать блоки памяти объемом более 64 Кбайт, что необходимо для поддержки очень больших метафайлов.