为什么开始我连续切换同一视图,却被new了两次?不是只new一次的?(关键问题请看下边的一个函数)
具体如下:例子代码:
http://www.czvc.com/down.asp?id=10--------------------------------------------
其中有代码:
void CMainFrame::SwitchToForm(int nForm)               //进行视图切换的代码函数
{
//CDocument* pDoc = GetActiveDocument();
    CView *pOldActiveView=(CView*)GetActiveView();             //保存旧视图
    CView *pNewActiveView=(CView*)GetDlgItem(nForm);   //取得新视图

    if(pNewActiveView==NULL)
    {
        switch(nForm)
            //这些ID是对话框的标志符,但也可以用其他的标志
        {
        case IDD_MULTIVIEW_FORM :
            pNewActiveView=(CView*)new CView1;
break;
        case IDD_MULTIVIEW_FORM2 :
            pNewActiveView=(CView*)new CView2;
AfxMessageBox("mu");
            break;
        case IDD_MULTIVIEW_FORM3 :
            pNewActiveView=(CView*)new CView3;
            break;
        case IDD_MULTIVIEW_FORM4 :
            pNewActiveView=(CView*)new CView4;
            break;
        }

        CCreateContext context;   //将文挡和视图相连
        context.m_pCurrentDoc=pOldActiveView->GetDocument();

pNewActiveView->Create(NULL, NULL, WS_BORDER|WS_CHILD ,
            CFrameWnd::rectDefault, this, nForm, &context);
        pNewActiveView->OnInitialUpdate();

    }
SetActiveView(pNewActiveView);        //改变活动的视图
    pNewActiveView->ShowWindow(SW_SHOW);  //显示新的视图
    pOldActiveView->ShowWindow(SW_HIDE);  //隐藏旧的视图

    if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView1))
pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM); else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView2))
pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM2); else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView3))
pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM3); else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView4))
pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM4);

pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);    
    
     delete pOldActiveView;   //删除旧视图

RecalcLayout();          //调整框架窗口
}
---------------------------------------------
本来这个例子每切换一次就new一次的,
但其中我把"delete pOldActiveView;   //删除旧视图"去掉了,但结果还是这样.

解决方案 »

  1.   

    我这里哪个消息框怎么只执行了一次啊!我只在你说的地方加了MESSAGEBOX,怎么切换都是执行一次啊!
      

  2.   

    也可以这样切换,在自定义函数里
    LRESULT CMainFrame::OnDoMain(WPARAM wParam,LPARAM lParam) //切换到某个视图
    {
    m_wndSplitter.DeleteView(0,1);
    m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMainView),CSize(0,0),NULL);
    m_wndSplitter.RecalcLayout();
    return 0L;
    }
    http://dev.csdn.net/article/12/12693.shtm
      

  3.   

    单文档切分窗口中视图切换http://www.vccode.com/file_show.php?id=2553
      

  4.   

    这是因为在第一次的时候,view1的dlgctrlid不是IDD_MULTIVIEW_FORM,所以当GetDlgItem(nForm)的时候,肯定是空的阿,所以最好是在进入的时候就进行一次切换
      

  5.   

    to laiyiling(最熟悉的陌生人) 
    你在那加的MessageBox啊 ?
    请在:
    case IDD_MULTIVIEW_FORM2 :
                pNewActiveView=(CView*)new CView2;
    AfxMessageBox("mu");
    里加看看好吗?
    另外,我看了你给我的那个sample,发现并不符合我的需求,我要的就是在:在切换时,如果没指定所需的pane的话,就"new"且"new pane"只被执行一次,其后就是真正的切换了。--------------------------------------------------------
    to flyelf(空谷清音) 
    我要的就是在:在切换时,如果没指定所需的pane的话,就"new"且"new pane"只被执行一次,其后就是真正的切换了。请问怎么进行一次切换?
    请post 一下行吗?
    -----------------------
    谢谢大家了。
      

  6.   

    怪了,我就在这么加的,其他什么也没改啊!连续切换两次FOREVIEW2也没问题?
      

  7.   

    如果愿意,把你显示了两次MessageBox的代码发到[email protected] 我看看
      

  8.   

    不在公司,机子上没装vc,建议楼主在主函数下直接加一个MesssageBox看你的switchtoform
    到底执行了几次
      

  9.   

    to  laiyiling(陌生人)
    已给你发邮件去了。请查收,谢谢。我的ftp下,ftp://kinkia.vicp.net/    的  MultiView1.rar
    ------------------------------
    问题在于MessageBox在 IDD_MULTIVIEW_FORM2 处会出现两次。
                     在 IDD_MULTIVIEW_FORM1 处只会出现一次。
      

  10.   

    msdn文档中有源代码,使用search查找,我以前开发过的
      

  11.   

    在初始化完成之后,post一个消息让立即切换一次