Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
38
Добавлен:
16.02.2016
Размер:
1.98 Mб
Скачать

Пример:

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 - имя документа по умолчанию (например, Docu­ment). Действительное имя документа формируется из указанного имени плюс порядковый номер документа. Если имя документа не указано, то по умолчанию используется значение 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.

Соседние файлы в папке VC++Баженова