Пример:
CSingleDocTemplate* pDocTemplate; pDocTempIate=new CSingleDocTemplate(IDR MAINFRAME, RUNTIME_CLASS(CAppDoc_Derived), RUNTIME CLASS(CMainFrame), RUNTIME_CLASS(CAppView_Derived)); 1 AddDocTemplate (pDocTemplate); |
void SetContainerInfo( UINT nIDOlelnPlaceContainer);
Этот метод позволяет задать идентификатор (ID) ресурсов, используемых для встраиваемых OLE-объектов. Как правило, этот метод вызывается в методе инициализации CWinApp::InitInstance.
void SetServerInfo( UINT nIDOleEmbedding, UINT nIDOlelnPlaceServer = 0, CRuntimeClass* pOleFrameClass = NULL, CRuntimeClass* pOleViewClass = NULL );
Этот метод позволяет задать идентификатор (ID) ресурсов, используемых приложением-сервером при активизации OLE-объектов.
virtual void AddDocument( CDocument* pDoc ); virtual void RemoveDocument( CDocument* pDoc );
Эти методы позволяют добавить/удалить указанный параметром pDoc документ к данному шаблону документа. С одним шаблоном документа может быть ассоциирован список документов. Переход между элементами списка может выполняться циклически по позиции документа в списке. В классах CMultiDocTemplate и CSingleDocTemplate эти методы переопределены.
virtual void LoadTemplate( );
Метод вызывается средой выполнения для загрузки ресурсов шаблона документов.
virtual POSITION GetFirstDocPosition( ) const = 0;
Этот метод может использоваться для получения позиции первого документа из списка документов, ассоциированных с шаблоном документа. Метод возвращает значение POSITION или NULL, если список пуст.
Для получения указателя на следующий документ списка следует использовать метод CDocTemplate::GetNextDoc со значением параметра POSITION, возвращаемого данным методом.
Это "чистый" метод, и следовательно, он обязательно должен быть переопределен в производном классе. virtual CDocument* GetNextDoc( POSITION& rPos ) const = 0;
Метод возвращает указатель на следующий документ списка документов, ассоциированных с данным шаблоном документа, а затем устанавливает значение rPos на следующий элемент списка. Если возвращаемый элемент последний в списке, то новое значение параметра rPos устанавливается равным NULL.
virtual BOOL GetDocString( CString& rString, enum DocStringlndex index ) const;
Этот метод позволяет получить указанную подстроку, описывающую тип документа. Параметры:
rString - ссылка на объект CString, в который будет занесена найденная подстрока.
index - индекс искомый подстроки. Он может быть указан одним из следующих значений:
CDocTemplate::windowTitle - заголовок главного окна приложения (например Microsoft Word). Только для SDI-приложений; CDocTemplate::docName - имя документа по умолчанию (например, Document). Действительное имя документа формируется из указанного имени плюс порядковый номер документа. Если имя документа не указано, то по умолчанию используется значение Untitled. CDocTemplate::fileNewName - имя типа данного документа. Для приложений, поддерживающих более одного типа документов, эта строка отображается при создании файла (например, в диалоге, вызываемом выполнением пункта меню File | New). Если значение этой строки не определено, то данный тип недоступен из меню File | New; CDocTemplate::filterName - описание типа документа и маски для фильтра подходящих документов данного типа (например, Word document (*.doc)). Если значение этой строки не определено, то данный тип недоступен из меню File | Open;
CDocTempIate::fflterExt - расширение для документов данного типа
(например, .doc). Если значение этой строки не определено, то данный тип недоступен из меню File | Open;
CDocTempIate::regFileTypeId - идентификатор типа документа, хранимый в реестре Windows;
CDocTemplate::regFileTypeName - имя типа документа, хранимое в регистрационной базе данных.
CFrameWnd* CreateOIeFrame( CWnd* pParentWnd, CDocument* pDoc, BOOL b Create View );
Создает окно-рамку для OLE-объекта. Если значение bCreateView равно нулю, то создается пустая рамка. Параметры:
pParentWnd - указатель на родительское окно-рамку.
pDoc - указатель на документ, на который будет ссылаться новый OLE-объект.
bCreateView - определяет, будет ли одновременно создано отображение.
virtual Confidence MatchDocType( LPCTSTR ipszPathName, CDocument*& rpDocMatch );
virtual Confidence MatchDocType( LPCTSTR IpszPathName, DWORD dwFileType, CDocument*& rpDocMatch );
Эти методы используются для определения типа шаблона документа, используемого для открытия файла. Также для приложений, поддерживающих несколько типов файлов эти методы позволяют установить какой шаблон документа применим для данного файла, для этого следует вызвать метод MatchDocType последовательно для каждого шаблона.
Эти методы возвращают значение, определяемое перечислением Confidence:
enum Confidence ( noAttempt,
maybeAttemptForeign, // Расширение имени файла не совпадает
raaybeAttemptNative, // Файл не открыт, но расширение имени файла // совпадает
yesAttemptForeign,
yesAttemptNative,
yesAlreadyOpen // Файл уже открыт
}; Параметры:
IpszPathName - полное имя файла, для которого определяется тип. rpDocMatch - указатель на документ, если указанный файл уже открыт.
virtual CDocument* CreateNewDocument( );
Этот метод позволяет создать новый документ, тип которого ассоциирован с данным шаблоном документа.
Метод возвращает указатель на новый созданный документ или NULL в случае возникновения ошибки.
virtual CFrameWnd* CreateNewFrame (CDocument* pDoc, CFrameWnd* pOther);
Этот метод использует объекты CRuntimeClass, передавая их конструктору для создания нового окна рамки с пристыкованными к нему документом и отображением.
Параметр р Other указывает окно-рамку, используемое как основа, но может быть равным NULL.
virtual void InitialUpdateFrarae( CFrameWnd* pFrame, CDocument* pDoc, BOOL bMakeVisible = TRUE );
После создания окна-рамки методом CreateNewFrame вызов данного метода позволяет выполнить обновление, вызвав метод OnlnitialUpdate, и сделать созданное окно видимым и активным.
Параметры:
pFrame - указатель на окно-рамку. pDoc - указатель на документ или NULL.
bMakeVisible - флажок, определяющий, следует ли сделать созданное окно видимым и активным. virtual BOOL SaveAllModified( );
Метод сохраняет все документы данного шаблона документа, которые были изменены. virtual void CIoseAllDocuments( BOOL bEndSession );
Метод закрывает все открытые документы. По умолчанию реализация этого методы вызывает метод CDocument: :DeleteContents для удаления содержания документа и затем закрывает окна-рамки для всех отображений сопоставленных документу. Обычно метод используется для обработки команды File | Exit.
Параметры:
bEndSession- определяет, следует ли завершать сеанс работы (TRUE - завершить).
Этот метод может быть переопределен с целью описания дополнительных Действий перед закрытием документа. Например, если документ представляет запись базы данных, то при переопределении этого метода можно выполнить отсоединение от базы данных перед закрытием документа.
virtual CDocument* OpenDocumentFile( LPCTSTR ipszPathName, BOOL bMakeVisible = TRUE ) = 0;
Метод позволяет открыть файл с указанным именем. Если параметр IpszPathName равен NULL, то создается новый файл: тип создаваемого файла определяется данным шаблоном документа.
virtual void SetDefaultTitle( CDocument* pDocument) = 0;
Метод загружает заголовок окна документа, используемый по умолчанию, и отображает его. Заголовок окна по умолчанию можно получить по индексу CDocTemplate::docName из метода CDocTemplate::GetDocString.
Класс CSingleDocTemplate
Класс CSingleDocTemplate определяет шаблон документа для SDI-приложений: одновременно может быть открыт только один документ; до-! кумент отображается в главном окне. Как правило, SDI-приложения поддерживают только один тип документа и соответственно имеют только один объект CSingleDocTemplate.
CSingIeDocTemplate( UINT nIDResource, CRuntimeClass* pDocClass, CRuntimeCIass* pFrameClass, CRuntimeClass* pViewClass ); Конструктор объекта CSingleDocTemplate.
Класс CMultiDocTemplate
Класс CMultiDocTemplate определяет шаблон документа для MDI-приложений: одновременно может быть открыто несколько документов; главное окно используется как пространство, в котором можно открывать несколько окон-рамок для отображения документов.
CMuItiDocTemplate( UINT nIDResource, CRuntimeClass* pDocClass, CRuntimeClass* pFrameClass, CRuntimeCIass* pViewClass );
Конструктор класса CMultiDocTemplate.
Например:
//использование шаблона документа CMultiDocTemplate
BOOL CMyApp::InitInstance()
{
AddDocTemplate( new CMultiDocTemplate( IDR_SHEETTYPE,
RUNTIME_CLASS( CSheetDoc ),
RUNTIME_CLASS( CMDIChildWnd ),
RUNTIME_CLASS( CSheetView )));
AddDocTemplate( new CMultiDocTemplate( IDR_NOTETYPE, RUNTIME_CLASS( CNoteDoc ),
RUNTIME_CLASS( CMDIChildWnd ), RUNTIME_CLASS( CNoteView ) ) ); II... }
Работа с документами
Класс CDocument
Класс CDocument предоставляет базисные возможности управления документами. Как правило, документ открывается по команде File | Open (идентификатор ID_FILE_OPEN) и сохраняется командой File | Save (идентификатор ID_FILE_SAVE).
Класс CDocument поддерживает набор стандартных операций над документом: создание, загрузка, сохранение.
Среда выполнения управляет документами, используя интерфейс, определяемый данным классом.
Каждый документ содержит указатель на сопоставленный ему объект шаблона документа - для каждого типа документа свой шаблон документа.
Пользователи взаимодействуют с документом посредством объекта отображение (наследуемого от класса CView или его производных классов), ассоциированного с документом. Отображение представляет образ документа в окне-рамке и интерпретирует действия пользователя как операции над документом. Одному документу может быть сопоставлено несколько объектов отображений. Когда пользователь открывает окно для документа, то среда выполнения создает объект отображение и пристыковывает его к документу, а шаблон документа определяет, какой тип отображения и окна-рамки используется для отображения каждого типа документа.
Документы являются частью стандартного маршрута команд среды выполнения и поэтому получают команды от компонентов стандартного интерфейса пользователя (например, от пункта меню File | Open). При этом они получают команды раньше активного объекта отображения. Если документ не обрабатывает данную команду, то она передается далее для обработки шаблону документа.
При изменении данных документа каким-то одним объектом отображения каждый из пристыкованных к документу объектов отображения должен также отобразить эти изменения. Для этого можно использовать метод UpdateAllViews, сообщающий всем отображениям, пристыкованным к данному документу, о необходимости обновления отображения.
Для работы с документами в приложении следует:
• создать производный класс от класса CDocument для каждого типа документа;
• добавить переменные - члены класса для хранения данных каждого документа;
• реализовать методы - члены класса, выполняющие чтение и изменение данных документа. Эти методы могут использоваться объектами отображениями для выполнения над документом;
• переопределить в производном классе документа метод CObject::Serialize для записи и чтения данных документа с диска.
Члены класса CDocument( );
Конструктор объекта класса CDocument.
После создания объекта для его инициализации в SDI-приложении следует переопределить метод OnNewDocument.
void AddView( CView* pView);
Метод пристыковывает отображение к данному документу и устанавливает для отображения указатель на сопоставленный ему документ . При этом он добавляет указанное отображение в список отображений, сопос-. тавленных данному документу. Этот метод вызывается средой выполнения для команд File | New, File | Open, Window | New и при разделении окна.
Параметры:
pView - указатель на добавляемое отображение.
Этот метод используется только при создании и пристыковке отображения вручную. Обычно, как правило, эти действия осуществляются средой выполнения в соответствии с шаблоном документа. '
Приведем пример фрагмента кода SDI-приложения, использующего два различных отображения. Синхронизация поддерживается только между активным отображениям и документом. Синхронизация с неактивным ото-j бражением выполняется в момент перевода его в активное отображение, что значительно эффективнее, чем постоянная поддержка синхронизации между данными документа и обоими отображениями.
BOOL CMainFrame::OnViewChange(UINT nCmdID)
CView* pViewAdd; // Указатель на первое отображение
CView* pViewRemove; // Указатель на второе отображение
CDocument* pDoc = GetActiveDocument(); // Указатель на активный документ
UINT nCmdID;
nCmdID = LOWORD(GetCurrentMessage()->wParam);
if((nCmdID == ID_VIEW_VIEW1) && (m_currentView == 1)) return; // Переключение на текущее отображение
if((nCmdID == ID_VIEW_VIEW2) && (m_currentView == 2)) return; // Переключение на текущее отображение
if (nCmdID == ID_VIEW_VIEW2)
{ // Переключение на другое отображение
if (m_pView2 == NULL)
{ m_pViewl = GetActiveView(); m_pView2 = new CMyView2; m_pView2->Create (NULL, NULL, AFX_WS_DEFAULT_VIEW,
rectDefault, this, AFX_IDW_PANE_FIRST + 1, NULL);
} pViewAdd = m_pView2; pViewRemove = m_pViewl; m_currentView= 2;
}
else
{ pViewAdd = m_pView 1; pViewRemove = m_pView2; m_currentView= 1;} int nSwitchChildID = pViewAdd->GetDlgCtrlID(); // Получение ID pViewAdd->SetDlgCtrlID(AFX_IDW_PANE_FIRST); // Установка ID,
// определяющего показ на переднем плане pViewRemove->SetDlgCtrlID(nSwitchChildID); // Смена ID pViewAdd->ShowWindow(SW_SHOW); // Показ нового активного отображения pViewRemove->ShowWindow(SW_HIDE); // Скрытие неактивного отображения pDoc->AddView(pViewAdd); // Присоединение к документу нового
// активного отображения
pDoc->RemoveView(pViewRemove); // Отсоединение неактивного отображения SetActive View(pViewAdd); RecalcLayout(); // Размещение на первом плане отображения
// с идентификатором AFX_IDW_PANE_FIRST
} CDocTemplate* GetDocTemplate() const;
Метод возвращает указатель на шаблон документа для данного типа документа или NULL, если шаблона документа для управления документом данного типа нет.
Приведем пример фрагмента кода, использующего указатель на шаблон документа.
CString strDefaultDocName; // Имя файла, устанавливаемое по умолчанию CString strBaseName; // Основа имени файла по умолчанию
CString strExt; // Расширение имени файла
// Эти строки являются подстроками информационной строки шаблона документа CDocTemplate* pDocTemplate = GetDocTemplate(); if (!pDocTemplate->GetDocString(strBaseName, CDocTemplate:rdocName) || !pDocTemplate->GetDocString(strExt, CDocTemplate::filterExt))
{
"AfxThrowUserExceptionO; // He предусмотрено шаблона для
// данного расширения имени файла strDefaultDocName = strBaseName + strExt; virtual POSITION GetFirstViewPosition( ) const;
Метод возвращает позицию первого отображения списка отображений Данного документа. Это значение передается методу GetNextView для циклического перехода между указателями на отображения из списка отображений.
Например:
POSITION pos = CDocument::GetFirstViewPosition(); // Позиция первого
// отображения CView* pFirstView = GetNextView( pos ); // Указатель на отображение
void CMyDoc::OnRepaintAllViews() // Посылка уведомлений всем { // отображениям об обновлении
POSITION pos = CDocument::GetFirstViewPosition();
while (pos != NULL)
{ CView* pView = GetNextView(pos); pView->UpdateWindow();} }
// Более простым способом достижения этого же результата является вызов // метода UpdateAllViews(NULL);
virtual CView* GetNextView( POSITION* rPosition ) const;
Метод возвращает указатель на отображение, указанное параметром rPosition. При этом значение rPosition устанавливается равным позиции следующего отображения из списка отображений для данного документа. Если полученное методом отображение последнее в списке, то значение rPosition устанавливается равным NULL. Пример:
POSITION pos = GetFirstViewPositionO; while (pos != NULL)
{ CView* pView = GetNextView(pos); pView->UpdateWindow(); } const CString& GetPathName() const;
Метод возвращает строку, содержащую полный путь для файла, ассоциированного с данным документом. Если файл не был сохранен (не установлен полный путь для имени файла), то возвращается пустая строка.
virtual void SetPathName (LPCTSTR ipszPathName, BOOL bAddToMRU = TRUE);
Метод устанавливает полный путь для файла, ассоциированного с данным документом.
Параметры: IpszPathName - строка, содержащая полный путь.
bAddToMRU - определяет, следует ли добавлять имя файла к списку файлов, открытых последними (MRU).
const CString& GetTitle( ) const;
Метод возвращает заголовок документа. Это может быть имя файла или значение, формируемое из информационной строки ресурса шаблона документа. Заголовок документа отображается как заголовок окна рамки.
virtual void SetTitle (LPCTSTR ipszTitle);
Метод устанавливает новый заголовок документа. BOOL IsModified();
Метод определяет, был ли изменен документ с момента его последнего сохранения. void RemoveView( CView* pView);
Метод отсоединяет указанное отображение от данного документа. Этот метод вызывается средой выполнения при закрытии окна-рамки или панели разделенного окна.
void SetModifiedCTag( BOOL bModified= TRUE );
Этот метод помечает документ как измененный. Это гарантирует, что перед закрытием документа среда выполнения выдаст пользователю запрос о сохранении сделанных изменений.
Вызов метода с параметром, равным FALSE, помечает документ как чистый (без изменений).
void UpdateAllViews( CView* pSender, LPARAM IHint = OL, CObject* pHint = NULL );
Этот метод вызывается отображением после изменения документа.
Параметры:
pSender - указатель на отображение, которое изменило документ, или NULL для обновления всех отображений. IHint - содержит информацию об изменениях. pHint - указатель на объект, содержащий информацию об изменениях.
Этот метод инициирует для каждого отображения, за исключением указанного параметром pSender, вызов методов CView::OnUpdate.
virtual BOOL CanCloseFrame( CFrameWnd* pFrame);
Метод вызывается средой выполнения перед тем, как закрыть окно документа. По умолчанию реализация этого метода проверяет, есть ли еще окна, отображающие этот документ. Если закрываемое окно-рамка последнее, связанное с данным документом, то пользователю выдается запрос о сохранении сделанных изменений.
virtual void DeleteContents( );
Метод вызывается средой выполнения для удаления данных объекта документа без разрушения самого объекта. Метод может также вызываться для очистки содержимого документа с целью его повторного использования или для реализации команды Edit | Clear All.
Реализация этого метода по умолчанию не выполняет никаких действий.
Приведем пример фрагмента кода, реализующего выполнение пункта меню Edit | Clear All.
void CMyDoc::OnEditClearAll() { DeleteContentsO; UpdateAIlViews(NULL); } void CMyDoc::DeleteContents() { // Переопределение метода } |
virtual void OnChangedViewList();
Метод вызывается средой выполнения при добавлении или удалении отображения для документа. По умолчанию реализация этого метода проверяет, является ли удаляемое отображение последним, для последнего удаляемого отображения удаляется и сам документ.
Этот метод следует переопределить, если, например, при удалении последнего отображения надо оставить документ открытым.
virtual void OnCIoseDocument( );
Метод вызывается средой выполнения при закрытии документа, например как часть выполнения команды File | Close. По умолчанию реализация этого метода вызывает метод DeleteContents для удаления данных документа, а затем закрывает все окна-рамки для всех отображений пристыкованных, к данному документу.
virtual BOOL OnNewDocument();
Метод вызывается средой выполнения при создании нового документа, например как часть выполнения команды File | New. По умолчанию реали-зация этого метода вызывает метод DeleteContents для удаления данных документа, а затем помечает документ как "чистый".
Отметим, что при переопределении метода следует вызывать метод OnNewDocument базового класса для выполнения стандартных действий. Как правило, переопределение метода заключается в инициализации нового документа: для SDI-приложений это переинициализация уже существующего документа, а для MDI-приложений - инициализация нового до-, кумента.
Приведем пример фрагмента кода, иллюстрирующего альтернативные способы инициализации объекта документа.
// Способ 1: Для MDI-приложения самый простой и эффективный способ - это
// выполнить инициализацию документа в конструкторе класса, так как всегда
// создается новый объект документ и для команды File | New, и для
// команды File | Open:
CMyDoc::CMyDoc() // Конструктор класса
{
// Код инициализации документа
}
// Способ 2: Для SDI или MDI приложения можно выполнить
// инициализацию документа, переопределив метод OnNewDocument.
//.При этом следует быть уверенным, что инициализация документа
// выполняется эффективно посредством сериализации (во время выполнения
// команд File | Save и File | Open).
BOOL CMyDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// Код инициализации документа return TRUE;
}
// Способ З: Если инициализация документа
// выполняется неэффективно посредством сериализации, то инициализацию
// следует выполнять в отдельном методе. Этот метод следует вызывать и из
// метода OnNewDocument, и из метода OnOpenDocument.
BOOL CMyDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
MyInitDocument(); // Разделяемый метод инициализации документа // Код дополнительных действий, не требуемых при десериализации // документа через File | Open
return TRUE; '
} virtual BOOL OnOpenDocument( LPCTSTR ipszPathName );
Метод вызывается средой выполнения при открытии нового документа, например как часть выполнения команды File | Open. По умолчанию реализация этого метода открывает указанный файл, вызывает метод DeleteContents, чтобы убедиться, что документ пуст, а затем вызывает метод CObject::Serialize для чтения содержимого файла и в заключение помечает Документ как "чистый".
При успешной загрузке документа метод возвращает ненулевое значение. Этот "метод может быть переопределен для реализации других механизмов управления данными, без использования архива, а также для определения дополнительного кода инициализации. virtual BOOL OnSaveDocument( LPCTSTR IpszPathName );
Метод вызывается средой выполнения при сохранении документа, например как часть выполнения команд File | Save или File | Save As. По Умолчанию реализация этого метода открывает указанный файл, вызывает метод CObject:: Serialize для записи данных из документа в файл и в заключение помечает документ как "чистый".
При успешном сохранении документа метод возвращает ненулевое значение.
Этот метод может быть переопределен для реализации других механизмов управления данными, а также для определения дополнительного кода для сохранения данных.
Параметры: ipszPathName - указатель на полное имя сохраняемого файла.
virtual void ReportSaveLoadException( LPCTSTR IpszPathName, CException* e, BOOL bSaving, UINT nIDPDefault);
Метод вызывается средой выполнения (как правило, при броске исклю-чення CFileException или CArchiveException) в случае возникновения ошибки при выполнении сохранения или загрузке документа.
virtual CFile* GetFile( LPCTSTR IpszFileName, UINT nOpenFlags, CFileException* p Error);
Метод возвращает указатель на объект CFile. Параметры:
IpszFileName - строка, содержащая путь к имени файла (абсолютный или относительный).
рError - указатель на существующий объект исключение, который указывает состояние завершения операции.
nOpenFlags - флажки, указывающие режим разделения и режим доступа. virtual void ReIeaseFile( CFile* pFile, BOOL bAbort);
Метод вызывается средой выполнения для освобождения файла, что делает его доступным для других приложений.
Параметры:
pFile - указатель на объект CFile.
bAbort - при значении FALSE для освобождения файла вызывается метоЛ CFile::Close а при значении - метод CFile::Abort (при этом исключение не бросается).
virtual BOOL SaveModified( );
Метод вызывается средой выполнения перед закрытием измененного документа. По умолчанию реализация этого метода выдает пользователю предупредительное сообщение, запрашивая, следует ли сохранить сделанч| ные изменения.
Если документ не может быть закрыт, то метод возвращает нулевое значение.
virtual void PreCloseFrame( CFrameWnd* pFrame );
Метод вызывается средой выполнения перед разрушением указанного параметром окна-рамки. По умолчанию реализация этого метода для класса CDocument не выполняет никаких действий. Этот метод используется в производных классах COleDocument и CRichEditDoc.
void OnFileSendMail();
Метод посылает сообщение по электронной почте, содержащее данный документ.
В классе COleDocument реализован метод OnFileSendMail для обеспечения корректного управления составными файлами. void OnUpdateFileSendMaiK CCmdUI* pCmdUI);
При поддержке MAPI-интерфейса (наличия библиотеки MAPI32.DLL, установки МАР1=1 в секции [Mail] файла WIN.INI) этот метод позволяет использовать команду ID_FILE_SEND_MAIL. В противном случае команда будет удалена из меню.
Параметры:
pCmdUI - указатель на объект CCmdUI, ассоциированный с командой ID_FILE_SEND_MAIL.
Сериализация данных
Библиотека MFC реализует модель обмена данными между документом и файлом через специальный объект, называемый архивом. Обмен данными между приложением и архивом называется сериализацией. Для обмена данными используется метод Serialize класса документа.
При создании шаблона приложения с помощью мастера AppWizard можно добавить меню File, содержащее пункты Open, Save и Save as. Для обработки каждого из указанных пунктов меню AppWizard вставляет в программный код класса документа (производного от CDocument) переопределяемый метод Serialize или для чтения состояния документа из архива, или для записи (загрузки) состояния документа в архив. Программисту остается только вставить в метод Serialize код, выполняющий запись переменных в архив и чтение переменных из архива.
Объект CArchive аналогичен объектам ввода/вывода cin и cout из библиотеки iostream C++. Однако CArchive выполняет операции чтения и записи в двоичном формате без форматирования текста.
Напомним, что для использования средств сериализации следует включить в объявление и реализацию класса соответственно макросы DE-CLARE_SERIAL и IMPLEMENT_SERIAL.
Класс CArchive
Класс CArchive не имеет базового класса.
Объект CArchive позволяет организовывать обмен данными между документом и файлом через промежуточный объект архив. Архив можно рассматривать как некоторый буфер, реализующий специальный механизм хранения данных. Создаваемый для документа и файла архив позволяет абстрагироваться от места расположения архива: в оперативной памяти или на диске.
Обмен данными между архивом и документом называют сериализацией1.
Перед созданием объекта CArchive должен быть создан объект CFile. Затем объект архив пристыковывается к объекту CFile (или производного от него класса).
Объект архив создается при вызове команд Open, Save и Save As.