admin管理员组

文章数量:1621908

一文档类
1,MFC文档相关类
    用于管理数据,封装了数据和视图窗口之间的操作。CDocument --父类CCmdTarget
2,使用
    1,利用CFrameWnd::LoadFrame函数创建框架窗口
    2,在框架窗口的WM_CREATE消息中创建视图窗口
    3,将视图窗口的WM_REATE消息中将视图类对象和文档类对象进行关系(建立绑定关系)

3.对象关系图
    theApp
      |-->m_pMainWnd
        |-->m_pViewActive
            |-->m_pDocument
                |-->m_viewList(视图类对象链表)
4.命令消息处理顺序
    默认 View-->Document-->FrameWnd-->WinApp
    注意顺序可任意更改,也可以添加自己的消息处理类(继承自CCmdTarget)


二 单文档视图构架
    1.相关类
    CWinApp/CFrameWnd/CView/CDocument - 文档类
    CDocTemplate - 文档模板类 (抽象类)
       CSingleDocTemplate  --单文档模板类
       CMultiDocTemplate   --多文档模板类

       CDocManager         --文档管理类
     2.使用
        关系
        theApp
           |->m_pDocManager(保存了文档管理类对象地址)
            |->m_templateList(文档管理类的链表成员)
            |------>|->CSingleDocTemplate
            ^
            |
        CSingleDocTemplate
            |->m_pDocClass (保存了&CMyDoc::classCMyDoc)
            |->m_pFrameClass (保存了&CMyFrameWnd::classCMyFrameWnd)
            |->m_pViewClass (保存了&CMyView::classCMyView)
            |->m_pOnlyDoc   (保存了文档类对象地址)

OnFileNew执行过程
    1,通过theApp获取文档管理类对象地址m_pDocManager
    2,通过m_pDocManager获取保存在m_templateList链表中的单文档模板类对象地址
    3,利用保存在单文档模板类对象中的m_pDocClass来创建文档类对象
    3,利用保存在单文档类模板类对象中的m_pFrameClass来动态创建框架类对象。
    3,利用框架类对象调用LoadFrame函数创建框架类窗口
    4,利用框架窗口的WM_CREATE消息处理动态创建视图类对象并创建视图窗口
    5,在视图类窗口WM_CREATE消息处理中将视图类对象和文档类对象进行关联

CWinApp::PreTranslateMessage 处理加速键需重写这个函数
除应用程序类自己定义,其他类都有MFC动态创建

伪代码:
    CMyFrameWnd *pFrame=new CMyFrameWnd();
    CCreateContext cct;
    cct.m_pCurrentDoc=new CMyDocument();
    cct.m_pNewViewClass=RUNTIME_CLASS(CMyView);
    pFrame->LoadFrame(...,&cct);{    //函数内部this指针为pFrame
        Create(...,&cct){  //this=pFrame
            CreateEx(...,&cct){
                CREATESTRUCT cs;
                cs.lpCreateParams=&cct;
                .....
                ::CreateWindow(...,&cct);    
                //窗口创建  触发框架窗口的WM_CREATE lParam获取cct
            }
        }
    }

    
伪代码:
    OnFileNew(){    //this=theApp;
        m_pDocManager->OnFileNew();{
        //this=m_pDocManager文档管理类对象
            CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();
            //重新获取存放在单文档模板类对象pTemplate的地址
            pTemplate->OpenDocumentFile(NULL);{
            //this=pTemplate this指针为自己new的单文档类地址
                pDocument = CreateNewDocument();{
                //this=pTemplate 单文档模板类对象地址
                    CDocument* pDocument =
                    (CDocument*)m_pDocClass->CreateObject();
                    //动态创建文档类对象地址
                    pFrame = CreateNewFrame(pDocument, NULL);{
                    //动态创建框架类对象 this=pTemplate
                        CCreateContext context;    //cct
                        context.m_pCurrentFrame = pOther;
                        context.m_pCurrentDoc = pDoc;
                        context.m_pNewViewClass = m_pViewClass;
                        context.m_pNewDocTemplate = this;
                        CFrameWnd* pFrame =
                        (CFrameWnd*)m_pFrameClass->CreateObject();
                        //动态创建框架类对象 pFrame
                        pFrame->LoadFrame(m_nIDResource,
                WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,   // default frame styles
                NULL, &context)//context-->cct 实现文档 视图类对象的关联

                    }
                }
            }
        }
    }

*****************************************************************
视图窗口WM_CREATE
CEditView::OnCreate(lpCreateStruct){
    //函数内部this指针为pView(动态创建的视图类对象)
    //参数为CreateWindowEx函数的12个参数  最后一个cct
    CCtrlView::OnCreate(lpCreateStruct){
        CCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams;
        //获取&cct
        pContext->m_pCurrentDoc->AddView(this);{    //this==pView
            //函数内部this指针为文档类指针.参数为pView
            m_viewList.AddTail(pView);
            //将视图类对象地址保存在文档类的一个链表成员中
            pView->m_pDocument = this;
            //将文档类对子昂地址保存在视图类指针成员中。
        ****    一个文档类对象课对应多个视图  比如多个窗口以不同的方式显示数据***
        一个视图对应一个文档

        视图类 用一个指针保存和他关联的文档类对象,
        所以一个视图类对象只能对应一个文档类对象

        文档类 用一个链表保存和他关联的视图类对象,所以一个文档类对象可以对应多个
        视图类对象。
        }
    }

}


WM_CREATE的lParam为CreateWindowEx的12个参数
*****************************************************************
框架窗口的WM_CREATE消息处理        mfc----->win32
CframeWnd::OnCreate(lpCreateStruct){
    //函数内部this指针为pFrame,参数为CreateWindowEx的12个参数
    CCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams;
    //获取了CreateWind

本文标签: 第六天MFC