Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Сохранение метафайла на диске и его загрузка




 

Шаг 21. Сохранение метафайла на диске.

В нашем приложении мы используем метафайл, который как таковой не является дисковым файлом и существует только в ОЗУ. Для сохранения метафайла на диске в классе CMetaFileDC имеется метод CopyMetaFile().

Замечание. Можно было бы сделать наш метафайл дисковым файлом, указав его имя в качестве параметра метода Create(), но для нашей цели это было бы неэффективное решение.

 

Сохранение метафайла разумно привязать к команде меню File→Save. Создайте с помощью мастера обработчик этой команды, имеющей идентификатор ID_FILE_SAVE. Не забудьте при этом выбрать создание обработчика именно в классе вида CPainterView. Примите имя OnFileSave() для обработчика команды сохранения файла. Имя файла пока просто «зашьем» в программу в виде константы, для чего надо добавить в заголовочный файл PainterDoc.h объявление член-данных HMETAFILE MetaFileHandle и CString MetaFileName (в то же место, что и объявление прежде описанного указателя pMetaFileDC), а в конструкторе класса CPainterDoc (файл PainterDoc.срр) задайте имя файла:

MetaFileName=”Painter.wmf”;

 

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

 
 

Соберите приложение и проверьте, по крайней мере, то, что оно не потеряло работоспособность. Проверить корректность сохранения файла можно только путем его загрузки. Если Вы выполните команду FileèSave приложения, то в каталоге проекта Вы должны обнаружить файл Painter.wmf и даже просмотреть его содержимое с помощью какого-нибудь подходящего средства.

Шаг 22. Загрузка метафайла с диска.

Создайте обработчик OnFileOpen() команды меню File→Open. Добавьте в него код загрузки метафайла:

 

Приведенный код позволяет создать только дескриптор файла, но еще, конечно не воспроизводит его и не делает собственно тем метафайлом, который мы используем в других методах программы. Опять-таки, как и в методе OnDraw(), надо создать новый метафайл, воспроизвести в нем загруженный с диска метафайл и заменить старый метафайл новым. Для обновления содержимого окна вида надо вызвать метод Invalidate(). Вот новая версия OnFileOpen():

 

Тестируйте программу, проверив ее работоспособность в различных режимах. Обратите внимание, что в функции OnFileOpen() мы объявляем локальный дескриптор MetaFileHandle, хотя могли бы воспользоваться и дескриптором с таким же именем, объявленным в классе документа.

Шаг 23. Создание нового метафайла.

Любое приложение, претендующее на роль полноценного приложения с удобным для пользователя интерфейсом, должно позволять создавать новые файлы. Сделаем это и мы. Для достижения этой благородной цели надо создать обработчик OnFileNew() команды меню File→New. Проделайте это.

В обработчике мы должны создать новый (пустой) метафайл, удалить текущий метафайл, установить новый метафайл в качестве текущего и обновить окно вида:

 

 
 

 

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

Теперь уже настало самое время посмотреть на содержимое окна Debug после (удачного?) завершения приложения. В нем Вы можете (и скорее всего уже смогли) обнаружить и такое сообщение примерно такого содержания (ключевая фраза «Detected memory leaks!»):

Detected memory leaks!

Dumping objects ->

D:\Workdir\ISVP\Projects\Painter\PainterView.cpp(86): {105} client block at 0x00325B58, subtype 0, 16 bytes long.

a CMetaFileDC object at $00325B58, 16 bytes long

 

Это сообщение может возникнуть при завершении приложения и смысл его заключается в том, что обнаружена утечка (leaks) динамической памяти, т.е. приложение зарезервировало некоторое количество памяти, но не освободило ее. Если такая утечка происходит многократно, то это плохо, так как в процессе (длительной) работы приложение понемногу будет «съедать» динамическую память и это, в конечном счете, приведет к его краху. В сообщении указана та строка программы, в которой память была зарезервирована. В данном случае это оператор

CMetaFileDC * NewMetaFile = new CMetaFileDC();

 

Раз мы выделили память для объекта NewMetaFile, то мы ее должны освободить. Где это сделать? И коню ясно, что в деструкторе:

 

Шаг 24. Самостоятельная работа по дальнейшему усовершенствованию гениального приложения.

1. Добавьте в приложение код, который позволит пользователю выбирать имя сохраняемого или открываемого файла с помощью стандартного диалога (класс CFileDialog) Windows. Пример использования класса CFileDialog имеется в разделе «Диалоги по выбору имени файла и каталога» конспекта лекций.

2. Добавьте вывод имени текущего файла в строку заголовка окна приложения с помощью функции AfxGetApp()->m_pMainWnd->SetWindowText("Имя_файла").

3. Добавьте к перечню фигур, обрабатываемых программой, свою фигуру в соответствии с номером вашего компьютера:

Номер компьютера Фигура
  Окружность
  Равносторонний треугольник
  Правильный пятиугольник
  Куб
  Цилиндр
  Трапеция
  Параллелограмм
  Сектор круга
  Конус
  Квадрат с закругленными углами
  Ромб
  Правильный шестиугольник

 

 





Поделиться с друзьями:


Дата добавления: 2014-12-26; Просмотров: 552; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.