一、单文档视图构架程序

  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;
}
View Code

相关文章: