7.MFC单文档视图构架程序

一、单文档视图构架程序

  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

 运行结果:

  

  伪代码:

  //////////////////////////////////////////////////////////////////////////////////////////

  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;

          }

        }

      }

    }

  }

原文地址:https://www.cnblogs.com/csqtech/p/5698681.html