我建了个单文档框架结构,然后通过视图分区将视图分为三部分。
第一个视图你建立TREEVIEW,通过点击tree的不同部分去切换不同的视图显示在第二个视图里面。
当点击的位置发生变化时,我先将当前的视图销毁,然后显示选择的视图。现在遇到一个问题。
当我第一次运行时,可以正常加载图片,点击TREEcontrol切换视图没问题,当重新点击图片的treecontrol,再次加载图片的时候,会发现无法找到之前加载的DOC。
想请教这个是什么原因。

解决方案 »

  1.   

    排查程序发现,在第一次创建VIEW的时候,加载了一次DOC,在删除以后再次创建的以后,没有加载DOC,所以GetDocument()函数找不到,所以才会出现问题,请问,如何让重新创建VIEW的时候重新加载DOC,我的DOC里面记载的是一个图片。
      

  2.   

    先要 取老 view ,老 view 里 有 doc
        CView* pOldActiveView = GetActiveView();
        CCreateContext cc;
        cc.m_pCurrentDoc=pOldActiveView->GetDocument();
      

  3.   

    我把源码贴上来大家看看
    工程名字为Module,是MFC SDI文档
    这是ModuleDoc.Cpp的加载图片的函数
    BOOL CModuleDoc::OnNewDocument()
    {
    //if (!CDocument::OnNewDocument())
    // return FALSE;
    m_Cover.Load(IDR_COVER);
    // TODO: 在此添加重新初始化代码
    // (SDI 文档将重用该文档) return TRUE;
    }
    加载图片后就创建VIEW了,然后就是执行view的OnInitialUpdate,CoverView是从SCROLLview派生出的一个类
    void CCoverView::OnInitialUpdate()
    {
    SetScrollSizes();
    }
    然后顺序执行下去,第一次加载图片完成
    然后通过改变选取的TreeControl的选项不同去选择切换VIEW
    void CMainTreeview::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
    CTreeCtrl& treeCtrl=GetTreeCtrl();
    DWORD num;
    //获取当前选中的树项
    HTREEITEM hSelectedItem=treeCtrl.GetSelectedItem();
    //获取当前选中的树项文本
    num =  (DWORD)treeCtrl.GetItemData(hSelectedItem); if(num == (DWORD)(0) )
    {
    //切换到封面视图
    pFrame->SwitchToView(COVERVIEW);
    }
    else if(num == (DWORD)(3))
    {
    //切换到封面视图
    pFrame->SwitchToView(OUTDOOR1SYSTEMVIEW);
    }
    /*if(str.Find(_T("Cover"))!=-1)
    {
    //切换到编辑视图
    pFrame->SwitchToView(COVERVIEW);
    }
    else if(str.Find(_T("OutDoor1System"))!=-1)
    {
    //切换到列表视图
    //pFrame->SwitchToView(LISTVIEW);
    }*/
    *pResult = 0;
    }切换目前没问题。
    接着我重新选择第一个页面,直接就进入了绘图的OnInitialUpdate(),没有加载图片。
    加入断点可以看出是在 CModuleDoc* pDoc = GetDocument();这里得到了一个空的指针,导致后续程序执行不正常那个。
    通过加入断点可以知道,第一次执行和第二次执行唯一不同就是第一次执行了一次OnNewDocument函数
      

  4.   

    你在 SwitchToView 里 
    “老的VIEW已经被销毁了啊”
    老的VIEW 销毁 前 要把 doc 保存下来。
    问题在 SwitchToView 里吧
      

  5.   

    问题解决了,跟你的方法不同。
    http://caojizi0612.blog.sohu.com/150276618.html
    因为我的是SDI程序,所以只需要在全局获得DOC就可以了