Прототип варианта 17 - Анализатор структуры метафайла, страница 4

В программе Analyze используется пять файлов. На главной форме, ANALYZE.FRM (листинг 8.8), находится список, заполняемый командами метафайла, и маленькое графическое поле для его воспроизведения. Флажок Single Step определяет режим воспроизведения файла — по одной команде или все сразу. Кнопка Analyze вызывает стандартное диалоговое окно для выбора загружаемого метафайла. Модуль ANALYZE.BAS содержит функцию косвенного вызова, которая должна находиться в стандартном модуле. Форма ANPROMPT.FRM (листинг 8.9) используется в процессе пошагового выполнения команд. Файл APIGID32.BAS содержит объявления для библиотеки динамической компоновки APIGID32.DLL, прилагаемой к книге. Файл QUIKDRAW.BAS, используемый программой для загрузки метафайлов, рассматривался выше в этой главе. В отличие от QuikDraw.vbp это приложение предназначено только для 32-разрядных систем, хотя при необходимости оно легко адаптируется.

Листинг 8.8. ANALYZE.FRM и ANALYZE.BAS

Анализ начинается с загрузки метафайла. Это делается практически так же, как и в приложении QuikDraw. В ходе подготовки к выводу метафайла устанавливается режим отображения для контекста устройства Picturel. Перечисление выполняется функцией EnumMetafile. Во время ее выполнения функция Callbackl_EnumMetaFile вызывается один раз для каждой записи метафайла. Работа EnumMetafile завершается лишь после того, как будут перечислены все записи метафайла или функция косвенного вызова вернет FALSE.

Функция CallbacklJEnumMetaFile вызывается для каждой записи метафайла. В качестве параметров ей передается контекст устройства, для которого выполняется перечисление, указатель на таблицу манипуляторов всех объектов GDI, используемых в настоящий момент, указатель на запись метафайла, количество элементов в таблице манипуляторов и переменная, определяемая пользователем (в данном примере не используется). Если функция возвращает FALSE, перечисление прекращается. Чтобы процесс перечисления перешел к следующей записи, функция должна вернуть TRUE.

Сначала функция заполняет локальную структуру METARECORD содержимым первой части записи метафайла. Эта информация используется для получения имени команды функцией GetFunctionName. Если метафайл воспроизводится в пошаговом режиме, форма frmPrompt вызывается в модельном режиме. При выгрузке эта форма присваивает переменной IncludeRecord признак того, должна ли воспроизводиться текущая запись или нет.

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

Затем функция просматривает таблицу манипуляторов. Если в таблице определены какие-либо объекты GDI, сведения о них также заносятся в список. Для этого манипуляторы копируются в массив, размер которого переопределяется в соответствии с размером таблицы манипуляторов. Помните о том, что манипуляторы являются 32-разрядными числами в Win32 и 16-разрядными в Win 16 (на случай, если вы захотите включить в программу совместимость с 16-разрядными системами).

Форма ANMPOMPT.FRM работает прямолинейно — она присваивает значение открытой переменной IncludeRecord главной формы в зависимости от того, какая кнопка была нажата. Каждый раз, когда эта форма выводится на экран, она располагается непосредственно под главной формой приложения.

VERSION 5.00

Begin VB.Form frmPrompt

Рекомендации для самостоятельной работы

На основе программы Analyze можно создать полноценный редактор метафайлов. Однако перед этим необходимо лучше разобраться с внутренней структурой записей метафайла. Для этого необходимо изучить структуру METARECORD, описанную в приложении Б, и больше узнать о работе со структурами данных и буферами в памяти — эти темы подробно рассматриваются в главе 15.