Шаг 27 - Пункт меню сохранить документ как в AppWizard

Создание проекта

Мы будем учить наш проект сохранять данные. Поэтому оставим старый. Но в ресурсах надо добавить идентификаторы и пункт меню Save.

Итак, идем в ресурсы и в меню создаем пункт меню Save, а идентификатор ставим ID_FILE_SAVE.

27_1.gif (3795 b)

Теперь нам нужно в ресурсах создать еще одну строку. С идентификатором AFX_IDS_ALLFILTER и содержанием *.my. Вообще то надо больше. Мы делаем самый минимум.

27_2.gif (1692 b)

Создаем код

В классе документа.

class CMyDoc : public CDocument	 // класс документа
{
........
virtual BOOL OnNewDocument(); // будет вызываться при выборе меню New
virtual void Serialize(CArchive& ar); // сохранение востановление файлов
DECLARE_DYNCREATE(CMyDoc)
........
};

И реализация.

void CMyDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring()) // если сохранение
{
ar << csDate; // записываем
}
else
{
// для чтения
}
}

Вот так она будет работать.

27_3.gif (23906 b)

Описание

Итак, функция Serialize. Если кратко, то это реализация сохранения на диск и похожа она на работу с потоками. Присваивание пункту меню идентификатора ID_FILE_SAVE приведет к тому, что данные будут сохраняться на диск. Создайте пункт меню, и он сразу будет доступен даже без описания в таблице откликов. В MFC есть механизм обработки этого идентификатора без нашего вмешательства. При вызове пункта меню с таким идентификатором MFC автоматически вызывает функцию Serialize из класса документа зарегистрированного в шаблоне.

pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME, // идентификатор меню
RUNTIME_CLASS(CMyDoc), // документ ----| Вот у этого класса вызовется Serialize !!!
RUNTIME_CLASS(CMainFrame), // рамка окна ---| Документ вид однако.
RUNTIME_CLASS(CMyView)); // просмотр ----|

А в этой функции мы автоматически сохраняет или читаем данные.

Только для работы этого пункта меню нужны строковые ресурсы. Именно с помощью них окну сохранения становиться известно какой фильтр, какое имя файла. Если вы вспомните "Шаг 15 - Стандартный диалог открытия файлов", то знаете, сколько параметров нужно передать классу CFileDialog. В данном случае эти параметры передаются через строковые ресурсы.

Компилируйте. Запускайте. Сохраните. Потом откройте в любом тестовом редакторе и вы увидите текст, который был на экране. Вот почти так работает волшебник, то есть создает такой код.

Шпаргалка

Сохранение происходит с использованием функции Serialize класса документа

Пункт сохранения должен иметь идентификатор ID_FILE_SAVE

Необходимо объявить как минимум один строковый ресурс AFX_IDS_ALLFILTER


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.