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

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

При создании метафайла...

Вы можете заполнить ограничивающий прямоугольник в структуре METAFILEHEADER габаритами логического окна, используемого метафайлом. Многие метафайлы самостоятельно задают габариты логического окна и устанавливают режим отображения MM_ANISOTROPIC, чтобы метафайл занимал всю область просмотра, заданную приложением. При включении функций SetWindowExtEx и SetMapMode в метафайл эти функции выполняются при воспроизведении, тем самым задавая систему координат логического окна.

При воспроизведении метафайла...

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

Системы координат и расширенные метафайлы

Возникает впечатление, что все происходящее требует немалой координации действий со стороны метафайла и приложения, и это действительно так. Заодно становится понятно, почему Microsoft разработала расширенный формат метафайлов. Расширенные метафайлы содержат подробную информацию об исходном разрешении устройства; следовательно, если вы создадите метафайл для конкретных физических размеров, приложение сможет узнать этот факт (хотя и не обязано использовать его). Однако графические функции метафайлов обладают существенно большими возможностями и могут позаботиться о настройке системы координат, чтобы эту информацию не пришлось включать в метафайл.

Все вместе II: дополнительные примеры

Программы QuikDraw и Analyze демонстрируют применение многих графических функций API, рассматриваемых в этой главе, и общие принципы работы с метафайлами.

Пример: QuikDraw — простое графическое приложение

Программа QuikDraw объединяет многие концепции, рассматривавшиеся в последних главах. При всей примитивности и ограниченности пользовательского интерфейса, этот простейший

Пример: Analyze — внутреннее устройство метафайла

Метафайл представляет собой записанные графические команды GDI — однако его, как и любую нормальную запись, можно редактировать. Перебор отдельных команд метафайла осуществляется при помощи процесса, называемого перечислением; этот процесс продемонстрирован в программе Analyze.vbp. В программе Analyze применяется функция перечисления, для работы которой в Visual Basic 4.0 был необходим демонстрационный элемент OLE DWCBK32D.OCX, прилагаемый к книге.

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

На рис. 8.11 показана программа Analyze в действии.

Рис. 8.11. Главная форма ANALYZE.FRM (во время работы программы)