注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

多多的爹

 
 
 

日志

 
 

深入解析MFC -- 文档视图结构  

2008-01-24 19:38:46|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

还记得刚在KS工作的时候,问某个老员工,为什么咱们的产品基本上都基于对话框的?他回答说,文档视图结构这公司能弄明白的人就没几个。工作这么多年后,再去了解文档视图结构,才发觉除非是天才,否则没几年工作经历的人,还是容易糊涂。
其实,了解文档视图结构也并不是那么麻烦,在了解其结构之前,先看看他们的创建过程,这里有一个非常简单的办法,建立一个单文档工作Your,然后在CYourView的构造函数中加上一个断点,中断后,看看堆栈:
AfxWinMain()                    // 调用pApp->InitInstance()
CYourApp::InitInstance
  CWinApp::ProcessShellCommand            // 发送新建文档的消息,AfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL)
   CWinApp::OnFileNew                // CWinApp接受到创建消息,并调用m_pDocManager->OnFileNew();
    CDocManager::OnFileNew
     CSingleDocTemplate::OpenDocumentFile
      CDocTemplate::CreateNewDocument        // 创建CYourDocument
      CDocTemplate::CreateNewFrame        // 创建CFrameWnd
       CFrameWnd::LoadFrame
        CFrameWnd::Create
        .....
         CMainFrame::OnCreate            // CFrameWnd创建完后,CMainFrame获得WM_CREATE的消息
      CFrameWnd::OnCreate
           CFrameWnd::OnCreateHelper
            CFrameWnd::OnCreateClient
             CFrameWnd::CreateView        // 创建视
至此,CYourView就被创建出来。我们也大概清楚他们之间的关系:
CYourApp拥有CDocManager实例。CDocManager拥有一个CDocTemplate列表,单文档程序只有一个CDocTemplate,此CDocTemplate派生类为CSingleDocTemplate,包含一个CDocument和CView。

多文档创建顺序不太一样:
AfxWinMain()                    // 调用pApp->InitInstance()
CYourApp::InitInstance
  CWinApp::ProcessShellCommand            // 发送新建文档的消息,AfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL)
   CWinApp::OnFileNew                // CWinApp接受到创建消息
    CDocManager::OnFileNew
     CMultiDocTemplate::OpenDocumentFile
      CDocTemplate::CreateNewDocument        // 创建CYourDocument
      CDocTemplate::CreateNewFrame        // 创建CChildFrame
       CMDIChildWnd::OnCreate            // CChildFrame接收到WM_CREATE消息,CMDIChildWnd是CChildFrame的基类
        CFrameWnd::OnCreateHelper        // CFrameWnd是CMDIChildWnd的基类
         CFrameWnd::OnCreateClient
          CFrameWnd::CreateView            // 创建视
多文档程序中CDocManager有多个CDocTemplate,每个CDocTemplate派生类为CMultiDocTemplate。
CDocument有一个成员变量m_viewList,这个list记录了所有相关联的View。CView在创建后,接收到WM_CREATE消息后,将自己放到了这个list中。因此CDocument可以通过GetNextView来获得CView,CView可以通过GetDocument来获得CDocument。

  评论这张
 
阅读(11)| 评论(6)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017