按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
。。。
由于CScribbleDoc 改写了OnOpenDocument,
if (lpszPathName == NULL) 所以调用的是CScribbleDoc::OnOpenDocument
{
// create a new document with default document name
。。。
}
else
{
// open an existing document
CWaitCursor wait;
if (!pDocument…》OnOpenDocument (lpszPathName))
{ 源代码请见本章前部之“CDocTemplate管理
。。。
CDocument/CView/CFrameWnd” 一节.
}
pDocument…》SetPathName(lpszPathName);
BOOL CScribbleDoc::OnOpenDocument(LPCTSTR lpszPathName)
} {BOOL CScribbleDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument (lpszPathName))
if (!CDocument::OnOpenDocument (lpszPathName))
return FALSE;
return FALSE;
InitDocument();
InitDocument();
return TRUE;
return TRUE;
}
}
InitialUpdateFrame(pFrame; pDocument; bMakeVisible);
return pDocument;
}
下页
517
…………………………………………………………Page 580……………………………………………………………
第篇 深入 MFC 程式設計
BOOL CDocument::OnOpenDocument(LPCTSTR lpszPathName)
{
CFileException fe;
CFile* pFile = GetFile(lpszPathName;
CFile::modeRead|CFile::shareDenyWrite; &fe);
DeleteContents();
SetModifiedFlag(); // dirty during de…serialize
CArchive loadArchive (pFile; CArchive::load |
CArchive::bNoFlushOnDelete);
loadArchive。m_pDocument = this;
loadArchive。m_bForceFlat = FALSE;
TRY
{
CWaitCursor wait;
if (pFile…》GetLength() != 0)
Serialize(loadArchive); // load me
loadArchive。Close(); 由于 Serialize
CScribbleDoc 改写了
ReleaseFile(pFile; FALSE); 所以调用的是CScribbleDoc::Serialize
}
。。。 void CScribbleDoc::Serialize(CArchive& ar)
} void CScribbleDoc::Serialize(CArchive& ar)
{
{
。。。
。。。
m_strokeList。Serialize (ar);
m_strokeList。Serialize (ar);
}
}
void CObList::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if (ar。IsStoring())
{
。。。
}
else 本例读入 0004
{
DWORD nNewCount = ar。ReadCount();
CObject* newData;
while (nNewCount……)
{
for
ar 》》 newData;
loop
AddTail(newData); operator》》 被多载( overloading )化
}
}
_AFX_INLINE CArchive& AFXAPI operator》》 (CArchive& ar;
}
CObject*& pOb)
{ pOb = ar。ReadObject (NULL); return ar; }
调用 CArchive::ReadObject
下页
518
…………………………………………………………Page 581……………………………………………………………
第8章 Document…View 深入探討
CObject* CArchive::ReadObject(const CRuntimeClass*
pClassRefRequested)
{
。。。
// attempt to load next stream as CRuntimeClass
UINT nSchema;
DWORD obTag;
CRuntimeClass* pClassRef = ReadClass (pClassRefRequested;
&nSchema; &obTag);
// check to see if tag to already loaded object
A
C CObject* pOb;
if (pClassRef == NULL)
{ 。。。 }
else
{
// allocate a new object based on the class just acquired
IMPLEMENT_SERIAL(CStroke;。。。)
pOb = pClassRef…》CreateObject();
曾展开出一个函数如下,此即动态生
成的奥秘:
// Add to mapping array BEFORE de…serializing
CheckCount();
CObject* PASCAL CStroke::CreateObject()
m_pLoadArray…》InsertAt(m_nMapCount++; pOb);
CObject* PASCAL CStroke::CreateObject()
{
{
return new CStroke;
return new CStroke;
}
// Serialize the object with schema no。 set in the archive
}
UINT nSchemaSave = m_nObjectSchema;
m_nObjectSchema = nSchema;
pOb…》Serialize(*this);
m_nObjectSchema = nSchemaSave;