Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
65-96.doc
Скачиваний:
5
Добавлен:
11.11.2019
Размер:
340.99 Кб
Скачать

Определение расширений сохраняемых в программе файлов

При выполнении команд открытия или сохранения файлов список стандартных расширений файлов отображается в поле File of type диалогового окна. Сейчас ваша программа предлагает использовать тип файла в виде All files (*.*). Для получения списка расширений файлов, нужных пользователю, измените строковый ресурс программы. Для этого выполните следующие действия.

  1. Откройте редактор строк, выполнив двойной щелчок в узле String Table в окне Resource View.

  2. Первая строка в окне редактора имеет идентификатор IDR_MAINFRAME. Она создана MFC Application Wizard и содержит информацию, относящуюся к программе MуPaint. Ее текущее значение такое (рис.3.7).

MуPaint\n\nMуPaint\n\n\nMуPaint.Document\nMуPaint.Document

Рис. 3.7. Окно таблицы строк

  1. Для изменения значения строки, откройте диалоговое окно Properties. Измените содержимое поля Caption следующим образом. При редактировании строки не нажимайте клавишу Enter. Когда текст достигнет правого края текстового поля, он автоматически будет перенесен на следующую строку.

MуPaint\n\nMуPaint\nMуPaint Files(*.drw)\n.drw\nMуPaint.Document

  1. Скомпилируйте и запустите программу. Вызовите диалоговое окно Open и убедитесь в том, что вы задали правильно строковый ресурс.

Строка MуPaint Files (*.drw), отображаемая в списке Files of type или Save as type диалогового окна Open или Save As, является фильтром типов файлов. Следующая строка .drw — расширение файлов, стандартное для данной программы. Если в процессе выполнения программы MуPaint расширение файла при открытии или сохранении не указано, то в диалоговых окнах Open и Save As отобразится список всех файлов со стандартными расширениями, а в диалоговом окне Save As стандартное расширение файла будет добавлено к его имени (рис. 3.1).

Альтернативный способ задания расширения имен файлов реализуется при создании приложения с помощью MFC Application Wizard. Для этого в диалоговом окне Document Template Strings в процессе создания первичного проекта введите в поле File extension стандартное расширение файла (без точки), например drw. Мастер автоматически введет описание расширения в поле Filter name (например, MуPaint Files (*.drw)).

Задание 2. Поддержка сериализации данных

В функцию CMуPaintDoc::Serialize() нужно добавить два обращения к функции CLine::Serialize(), реализовать функцию сериализации в классе линий CLine и обеспечить поддержку сериализации. Для этого выполните следующие действия.

  1. Добавьте в реализацию класса документа в определение функции CMуPaintDoc::Serialize() код, выделенный полужирным шрифтом.

// CMуPaintDoc serialization void CMуPaintDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here m_LineArray.Serialize (ar); } else { // TODO: add loading code here m_LineArray.Serialize (ar); } }

  1. Поддержка сериализации класса CLine обеспечивается включением в интерфейс класса CLine в файл MуPaintDoc.h макроса DECLARE_SERIAL().

class CLine : public CObject { protected: int m_X1, m_Y1, m_X2, m_Y2; DECLARE_SERIAL (CLine) … };

  1. В реализацию классов, которые являются производными от сериализуемого класса CObject, необходимо включать макрос IMPLEMENT_SERIAL()с целью обеспечения доступа к имени класса во время выполнения программы. Макросу передаются такие параметры: имя самого класса, имя базового класса, номер версии программы. Номер версии сохраняется внутри записанного файла, прочитать который может только программа, указавшая такой же номер. Номер версии предотвращает чтение данных программой другой версии. Для текущей версии MуPaint задан номер 1. В более поздних версиях он увеличивается при каждом изменении формата данных. Нельзя задавать номер версии -1. В реализацию класса документа MуPaintDoc.cpp добавьте код

// CLine member functions IMPLEMENT_SERIAL(CLine, CObject, 1)

  1. Для исключения ошибок компиляции, связанных с отсутствием подходящего конструктора класса, определите конструктор без параметров. Для этого с помощью команды Add Function вызовите мастер Add Member Function Wizard для класса CLine, в поле Function name задайте имя класса CLine, очистите поля Return type, Parameter type, Parameter name, нажмите кнопку Finish. Эти макрокоманды и конструктор позволяют функции CLine::Serialize() сохранить информацию класса в файле, а затем использовать ее для динамического создания объекта класса. В результате добавления получите код интерфейс класса CLine, приведенный ниже.

class CLine : public CObject { protected: int m_X1, m_Y1,m_X2,m_Y2; DECLARE_SERIAL (CLine) public: CLine(int X1,int Y1,int X2,int Y2); virtual ~CLine(); void Draw (CDC *PDC); virtual void Serialize(CArchive& ar); CLine(void); };

  1. Для сериализации класса CLine необходимо переопределить виртуальную функцию CObject::Serialize(). Для этого добавьте объявление функции Serialize() в раздел public интерфейса класса CLine в файле MуPaintDoc.h., выполнив такие действия. Выделите класс CLine в окне Class View. В окне свойств (Properties) щелкните на кнопке Overrides (Переопределения) панели инструментов. Щелкнув в поле Serialize, получите изображение кнопки для раскрытия списка. Выберите в списке команду <Add> Serialize. В код интерфейса и реализации класса CLine добавится объявление и шаблон функции Serialize().

class CLine : public CObject { . . . public: . . . CLine(void); virtual void Serialize(CArchive& ar); };

  1. В функцию CLine::Serialize() в файле реализации класса документа MуPaintDoc.cpp добавьте следующий код, показанный полужирным шрифтом.

void CLine::Serialize(CArchive& ar) { if (ar.IsStoring()) {// storing code ar << m_X1 << m_Y1 << m_X2 << m_Y2; } else {// loading code ar >> m_X1 >> m_Y1 >> m_X2 >> m_Y2; } }

  1. Сохраните все файлы программы, выполнив команду File4 Save All и запустите программу на выполнение.

В процессе работы программы можно, нарисовав линии, сохранить их в файле, выполнив команду File4 Save As… . В окне Save As укажите имя файла, расширение drw для файлов уже задано. При открытии файла по команде File4Open… окно представления обновляется, и отображаются линии. Если файл сохраняется, то имя файла появляется в меню File в списке последних открываемых файлов вместо команды Recent File (рис. 3.8), которая при первом запуске программы была неактивна.

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