То что в результате сохранения данных из класса документа вызывается функция Serialize мы с Вами уже знаем. Вот такой код гененирует AppWizard.
/////////////////////////////////////////// // CTestSaveDoc serialization void CTestSaveDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here } else { // TODO: add loading code here } }
Но мы то с Вами хотим больше и больше и еще больше контроля над процессом бритья ой :-) сохранения. Так вот в классе CDocument есть возможность улучшить контроль над сохранением файлов и добавить свои специфические действия. Это делается путем перегрузки виртуальных функций. Как их увидеть ??? Выделите класс потомок от CDocument, после этого нажмите правую кнопку мыши и выберите пункт меню Add Virtual Funсtion. Нас интересуют функции связанные с сохранением документа, а это OnSaveDocument(LPCTSTR lpszPathName) и SaveModified().
Перегрузите их для исследования и добавьте следующий код с сообщениями
////////////////////////////////// // CTestSaveDoc commands BOOL CTestSaveDoc::SaveModified() { AfxMessageBox("SaveModified()"); return CDocument::SaveModified(); } BOOL CTestSaveDoc::OnSaveDocument(LPCTSTR lpszPathName) { AfxMessageBox("OnSaveDocument(LPCTSTR lpszPathName)"); return CDocument::OnSaveDocument(lpszPathName); }
Для полноты картины создадим пукт меню, который будет сообщать о том, что документ изменен. Мы это делали уже.
void CTestSaveDoc::OnEditModified() { SetModifiedFlag(); }
Вот. Давайте разбираться когда вызывается какая функция. OnSaveDocument() вызывается всегда когда сохраняется документ, в том числе и пунктами меню Save и Save As... из приложений созданных App Wizard. Так же Вы сами можете вызывать эту функцию во всяких специфических ситуациях, например, при получении сигнала с блока питания о перебоях с питанием :-). Эта функция вызовет Serialize.
virtual BOOL OnSaveDocument( LPCTSTR lpszPathName );
Функция SaveModified() вызывается перед закрытием измененного документа и именно она выводит диалоговое окно о том, что документ был изменен. Ее вам надо переопределять для того, чтобы вставить свои специфические действия. Какие ??? Ну, например, сообщить серверу кто правил документ, записать это в БД чтобы потом найти крайнего и виноватого :-). Общая схема такая.
Сохранение документа OnSaveDocument Serialize Закрытие документа SaveModified OnSaveDocument Serialize