一、单文档视图构架程序
1.相关问题
只能管理一个文档(只有一个文档类对象)
2.相关类
CWinApp / CFrameWnd / CView / CDocument
CDocTemplate - 文档模板类
CSingleDocTemplate - 当文档模板类
CDocManager - 文档管理类
3.关系图
theApp
|--> m_pDocManager //文档管理类对象地址
|-->m_templateList //保存单文档模板类地址的链表
|-->CSingleDocTemplate(pTemplate)
|--> m_pOnlyDoc //文档类对象地址
|--> m_pDocClass //文档类静态变量地址,RUNTIME_CLASS( CMyDoc )
|--> m_pFrameClass //框架类静态变量地址,RUNTIME_CLASS( CMyFrameWnd )
|--> m_pViewClass //视图类静态变量地址,RUNTIME_CLASS( CMyView )
4.OnFileNew( )函数的执行过程
(1)通过应用程序类对象的成员m_pDocManager获取文档管理类对象地址
(2)通过文档管理类对象的成员m_templateList获取单文档模板类对象地址
(3)通过单文档模板类对象获取m_pDocClass(文档类静态变量),并用这个静态变量调用CreateObject函数创建文档类对象
(4)通过单文档模板类对象获取m_pFrameClass(框架类静态变量),并用这个静态变量调用CreateObject函数创建框架类对象
(5)利用框架类对象,调用LoadFrame函数,创建框架窗口
(6)在处理主框架窗口的WM_CREATE消息时,动态创建视图类对象,并创建视图窗口
(7)在处理视图窗口的WM_CREATE消息时,将视图类对象和文档类对象建立绑定关系
相关代码:

#include "stdafx.h" class CMyDoc : public CDocument { DECLARE_DYNCREATE(CMyDoc) }; IMPLEMENT_DYNCREATE(CMyDoc, CDocument) class CMyView : public CEditView { DECLARE_DYNCREATE(CMyView) }; IMPLEMENT_DYNCREATE(CMyView, CEditView) class CMyFrameWnd : public CFrameWnd { DECLARE_DYNCREATE(CMyFrameWnd) }; IMPLEMENT_DYNCREATE(CMyFrameWnd, CFrameWnd) class CMyWinApp : public CWinApp { public: virtual BOOL InitInstance(); }; CMyWinApp theApp; BOOL CMyWinApp::InitInstance() { CSingleDocTemplate *pTemplate = new CSingleDocTemplate( IDR_MENU1, RUNTIME_CLASS(CMyDoc), RUNTIME_CLASS(CMyFrameWnd), RUNTIME_CLASS(CMyView)); AddDocTemplate(pTemplate); OnFileNew(); m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; }
运行结果:
伪代码:
//////////////////////////////////////////////////////////////////////////////////////////
CSingleDocTemplate::CSingleDocTemplate( nIDResource, pDocClass, pFrameClass, pViewClass )
{
//父类构造函数
CDocTemplate::CDocTemplate( nIDResource, pDocClass, pFrameClass, pViewClass )
{
m_pDocClass = pDocClass;
m_pFrameClass = pFrameClass;
m_pViewClass = pViewClass;
......
}
m_pOnlyDoc = NULL;
}
//////////////////////////////////////////////////////////////////////////////////////
CWinApp::AddDocTemplate( pTemplate ) //this为&theApp
{
if ( m_pDocManager == NULL )
m_pDocManager = new CDocManager;
m_pDocManager->AddDocTemplate( pTemplate ) //this为文档管理类对象地址
{
if ( pTemplate == NULL ) { ...... }
else
{
pTemplate->LoadTemplate( );
m_templateList.AddTail( pTemplate );
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
OnFileNew( ) //this为&theApp
{
m_pDocManager->OnFileNew( ) //this为文档管理类对象地址
{
//拿到链表头结点,因为链表只有一个结点,即尾节点,单文档模板类对象地址
CDocTemplate* pTemplate = ( CDocTemplate* )m_templateList.GetHead( );
pTemplate->OpenDocumentFile( NULL ) //this为单文档模板类地址
{
return OpenDocumentFile( lpszPathName, TRUE, bMakeVisible ) //this为单文档模板类地址
{
CDocument* pDocument = NULL;
CFrameWnd* pFrame = NULL;
pDocument = CreateNewDocument( ) //this为单文档模板类地址
{
//动态创建CMyDoc对象并保存地址
CDocument* pDoc = ( CDocument* )m_pDocClass->CreateObject( ); //★★★
AddDocument( pDoc ) //this为单文档模板类地址
{
CDocTemplate::AddDocument( pDoc );
m_pOnlyDoc = pDoc; //▲▲▲
}
return pDoc;
}
pFrame = CreateNewFrame( pDocument, NULL ) //this为当文档模板类对象地址
{
CCreateContext context;
context.m_pCurrentFrame = NULL; //
context.m_pCurrentDoc = pDocument; //文档类对象地址
context.m_pNewViewClass = m_pViewClass; //RUNTIME_CLASS(CMyView)
context.m_pNewDocTemplate = this; //
//动态创建CMyFrameWnd对象并保存地址
CFrameWnd* pFrame = ( CFrameWnd* )m_pFrameClass->CreateObject( ); //★★★
//创建框架窗口
pFrame->LoadFrame( ......, &context ); //★★★
return pFrame;
}
}
}
}
}