zoukankan      html  css  js  c++  java
  • 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;

              }

            }

          }

        }

      }

  • 相关阅读:
    StackExchange.Redis 使用 (一)
    委托的一个小问题
    MemberwishClone学习
    类的内容学习
    类的学习
    构造函数学习
    C# 重新筑基-从头开始
    C语言入门:结构体+文件的应用
    C语言入门:结构体的概要
    C语言入门:指针的概要
  • 原文地址:https://www.cnblogs.com/csqtech/p/5698681.html
Copyright © 2011-2022 走看看