似乎不能在~CMainFrame()中delete,你可以试试在CMainFrame::OnDestory()中作。

解决方案 »

  1.   

    从 CFormView 派生 CMyFormView ,重载下面的函数,外部不必delete
    void CMyFormView ::PostNcDestroy()
    {
    // Free the C++ class.
    delete this;
    }
      

  2.   

    哈哈,想做多视图吗?
    你上面的做法我可这样做过,但起码可以说是不地道生成多视的方法。
    没错!当你用CFormView类时,系统给你生成类的构造函数是protected的,这么说这个类一般不是在应用程序里用new生成实例的。
    还记得Doc - View框架吧!Doc和View两个类的构造函数也不就是protected的!
    所以CFormView类实例的创建是MFC独有的所谓“动态创建”方式来创建的。至于清除的操作你就不用管啦,把这个概念搞懂后,可以看看下面的代码:
    pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CNewSDIDoc),
    RUNTIME_CLASS(CMainFrame),       
    RUNTIME_CLASS(CNewSDIView));
    上面的代码就是“动态创建”实例的过程。(* RUNTIME_CLASS(CNewSDIView) *)
    好,下面就是多视的创建过程,也是一种“动态创建”方法:BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
    // TODO: Add your specialized code here and/or call the base class
    m_wndSplitter.CreateStatic(this,1,3);
    m_wndSplitter.CreateView(0,2,RUNTIME_CLASS(CTreeList),CSize(0,0),pContext);
    m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CEditForm),CSize(rect.Width()/3,0),pContext);
    m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMyTreeView),CSize(rect.Width()/3,0),pContext);

    SetActiveView((CView*)m_wndSplitter.GetPane(0,0));
    return TRUE;//CFrameWnd::OnCreateClient(lpcs, pContext);如果return CFrameWnd::OnCreateClient(lpcs, pContext);你的多视创建就白干了
    }
    在CMainFrame类中有一个叫CSplitterWnd类的成员变量:m_wndSplitter,它是专门用来维护多视图的一个类。
    CTreeList,CEditView 就是CFormView的派生类。CMyTreeView就是CTreeView的派生类。至于详细的操作就请眼MSDN啦,我有一个多视图的程序发一个给你吧。