【交互】MFC各个类之间相互访问分析

一、访问分析

     
     【交互】MFC各个类之间相互访问分析_第1张图片

1、MDI框架(CMainFrame)调用,CFrameWnd::GetActiveDocument可获得与当前活动的视相关联的活动文档pDocument

2、CFrameWnd::GetActiveView调用,如果是MDI窗口(CMainFrame),则返回NULL,其可以通过调用MDIGetActive找到活动的MDI子窗口,然后找到该子窗口(CChildFrame)的活动视图

3、MDI框架调用CFrameWnd::GetActiveFrame,获得当前活动CChildFrame窗口指针,该函数里面调用了MDIGetActive,然后向CMDIFrameWnd::m_hWndMDIClient发送WM_MDIGETATIVE消息,(CMDIChildWnd*)CWnd::FromHandlePermanent(hWnd)得到对象。

4、CDMIChildWnd调用GetMDIFrame获得MDI框架窗口

5、CWinApp调用AfxGetMainWnd得到应用程序theApp的m_pMainWnd对象指针

二、实例分析

      1、 切分窗口实现

              用在CMDIChildWnd派生一个子窗口,中声明CSplitterWnd m_Splitter中,CSplitterWnd::CreateView,new 一个pView,然后把CChildFrame对象指针传给pView->Create(..this..)作为父窗口。

    m_Splitter.CreateStatic(this,1,2);//1行2列
     m_Splitter.CreateView(0,0,..);//第1行,第1列
    m_Splitter2.CreateStatic(&m_Splitter , 2 , 1 , ... m_Splitter.IdFromRowCol(0,1));//在m_Splitter的基础上第一行,第2列,在创建

            【交互】MFC各个类之间相互访问分析_第2张图片

      【交互】MFC各个类之间相互访问分析_第3张图片

  2、MFC的视图View【5、6】

        单文档CMainFrame当中,做了这样的设置:这边没有将pView加入到文档中,所以无法获取pDocument。

       【交互】MFC各个类之间相互访问分析_第4张图片

  3、MFC—文档视图 
        多文档中,其他都派生,在class CDrawApp : CWinApp的初始化中,重新定义了一个菜单资源IDR_MFCMDITYPE

CDrawApp::InitInstance()
{
CMultiDocTemplate *pTemplate = new CMultiDocTemplate(
        IDR_MFCMDITYPE, 
        RUNTIME_CLASS(CDrawDoc), 
        RUNTIME_CLASS(CDrawChildFrm),
        RUNTIME_CLASS(CDrawView)
        );
    AddDocTemplate(pTemplate);

    //创建主窗口
    CMainFrm* pMainFrm = new CMainFrm();
    pMainFrm->LoadFrame(IDR_MAINFRAME);
    m_pMainWnd = pMainFrm;

   //默认新建一个文档子窗口
    OnFileNew();

   //显示主窗口

    pMainFrm->ShowWindow(m_nCmdShow);

    pMainFrm->UpdateWindow();

    return TRUE; 

}

参考:1、MFC多文档多视图编程
2、文档/视图结构中的各个部分是如何联系到一起的
3、MFC文档视图结构 各个互访方式
4、MFC指针的获取
5、MFC的视图View
6、MFC—文档视图
7、在MFC类中各种类的指针的获取和应用
8、mfc获得各个类的句柄

你可能感兴趣的:(SDK,/,MFC)