Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Фролов Александр. Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT - royallib.ru.doc
Скачиваний:
103
Добавлен:
11.03.2016
Размер:
905.62 Кб
Скачать

Создание нового документа

Документ, который вы можете создать в приложении Single, можно убрать, только полностью закрыв приложение. Функция создания нового документа не работает. Когда вы выбираете из меню File строку New или нажимаете кнопку

, расположенную в панели управления приложения, внешний вид документа не изменяется.

Оказывается, когда пользователь выбирает из меню File строку New, вызывается виртуальный метод OnNewDocument, определенный в классе CDocument. Если вы не переопределите этот метод, то по умолчанию он вызывает метод DeleteContents, и далее помечает его как чистый (пустой). Вы можете переопределить метод OnNewDocument в своем классе документа, чтобы выполнить его инициализацию. Требуется, чтобы вы вызывали из переопределенного метода OnNewDocument, метод OnNewDocument, определенный в базовом классе CDocument.

Когда пользователь создает новый документ в приложении, построенном на основе однооконного интерфейса, то на самом деле используется старый документ. Новый объект класса, представляющего документ, не создается. Метод OnNewDocument должен удалить содержимое документа и выполнить повторную инициализацию существующего объекта класса документ.

Из этого следует, что нельзя выполнять инициализацию документа в конструкторе класса документа, так как конструктор будет вызван только один раз за время работы приложения. Более правильно использовать для этой цели метод OnNewDocument.

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

//////////////////////////////////////////////////////////////

// Метод DeleteContents

void CSingleDoc::DeleteContents() {

 // TODO:

 // Очищаем документ, удаляя все элементы массива arrayFig.

 // Метод RemoveAll определен в классе CArray

 arrayFig.RemoveAll();

 // Вызываем метод DeleteContents базового класса CDocument

 CDocument::DeleteContents();

}

Сохранение и восстановление документа на диске

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

Вы можете попытаться его открыть, выбрав из меню File строку Open. Однако единственным результатом будет изменение заголовка окна. Чтобы приложение обрело возможность сохранения документов в файле и последующего чтения, надо изменить метод Serialize класса документа CSingleDoc.

Метод Serialize вызывается всякий раз когда надо сохранить документ в файле на диске или загрузить его из существующего файла. В частности, метод Serialize вызывается, когда пользователь выбирает из меню File строки Save, Save As и Open. Основные принципы работы метода Serialize были рассмотрены нами в разделе “Запись и восстановление объектов”.

MFC AppWizard подготавливает шаблон метода Serialize для класса CSingleDoc, представляющего документ приложения.

//////////////////////////////////////////////////////////////

// Метод Serialize класса CSingleDoc отвечает за сохранение и

// последующее восстановление документов приложения

void CSingleDoc::Serialize(CArchive& ar) {

 if (ar.IsStoring()) {

  // TODO: Здесь выполняется сохранение документа

 } else {

  // TODO: Здесь выполняется загрузка документа

 }

}

Вы должны определить в методе Serialize, как он должен сохранять и восстанавливать документы приложения. Так как документ, с которым работает наше приложение представлен классом CSingleDoc, то все что должен делать метод Serialize – это сохранять все элементы массива arrayFig.

//////////////////////////////////////////////////////////////

// Метод Serialize класса CSingleDoc

void CSingleDoc::Serialize(CArchive& ar) {

 int i; // временная переменная

 int num; // количество фигур в документе

 // Сохранение документа

 if (ar.IsStoring()) {

  // Определяем количество элементов массива arrayFig

  num = arrayFig.GetSize();

  // Записываем полученное число в файл

  ar << num;

  // Записываем в файл координаты и тип фигур

  for (i=0; i<num; i++) {

   // Сохраняем координаты центра фигуры

   ar << arrayFig[i].xyFigCenter;

   // Сохраняем тип фигуры

   ar << arrayFig[i].cType;

  }

 }

 // Загрузка документа

 else {

  // Считываем количество элементов, составляющих документ

  ar >> num;

  // Восстанавливаем документ

  for (i=0; i<num; i++) {

   CFigure OneFigure; // описание одной фигуры

   // Считываем координаты центра фигуры

   ar >> OneFigure.xyFigCenter;

   // Считываем тип фигуры

   ar >> OneFigure.cType;

   // Добавляем описание очередной фигуры в документ

   arrayFig.Add(OneFigure);

  }

 }

}

Метод Serialize имеет единственный параметр ar, представляющий ссылку на объект класса CArchive. Этот объект, называемый архивом, представляет файл документа, расположенный на диске. Кроме того, архив несет в себе информацию о том, что делать с документом – записать его в файл или загрузить из файла.

После вызова, метод Serialize определяет, какую операцию надо выполнить – сохранить документ в файле или загрузить его из файла. Для этого используется метод IsStoring, определенный в классе CArchive. Если метод IsStoring возвращает ненулевое значение для объекта ar, переданного методу Serialize, значит надо сохранить документ в файле.

Чтобы сохранить все элементы массива, мы определяем количество элементов в нем с помощью метода GetSize. Этот метод определен в шаблоне CArray и возвращает количество элементов массива.

Мы сохраняем количество элементов массива в файле, представленном архивом ar. Это значение поможет нам при восстановлении документа с файла на диске. Затем в цикле в файл записываются все элементы массива arrayFig.

Загрузка документа из файла выполняется в том же порядке. Сначала из файла документа, представленного архивом ar считывается значение, определяющее количество фигур в документе. Потом из файла считываются по очереди все элементы документа. При этом они сразу заносятся в массив arrayFig, представляющий документ. Для этого используется метод Add шаблона CArray.

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