这在CSDN上已经是一个很老的问题了,但是一直没有得到比较好的解决
  void   CMainFrame::SwitchToView(eView   nView)   
  {   
          CFormview*   pOldActiveView   =   GetActiveView();   
          CFormView*   pNewActiveView   =   (CFormView*)   GetDlgItem(nView);   
          if   (pNewActiveView   ==   NULL)   {   
                  switch   (nView)   {   
                  case   STRING:   
                          pNewActiveView   =   (CFormView*)   new   CStringView;   
                          break;   
                  case   HEX:   
                          pNewActiveView   =   (CFormView*)   new   CHexView;   
                          break;   
                  }   
                  CCreateContext   context;   
                  context.m_pCurrentDoc   =   pOldActiveView->GetDocument();   
                  pNewActiveView->Create(NULL,   NULL,   WS_BORDER,   
                          CFrameWnd::rectDefault,   this,   nView,   &context);   
                  pNewActiveView->OnInitialUpdate();   
          }   
          SetActiveView(pNewActiveView);   
          pNewActiveView->ShowWindow(SW_SHOW);   
          pOldActiveView->ShowWindow(SW_HIDE);   
          pOldActiveView->SetDlgCtrlID(   
                  pOldActiveView->GetRuntimeClass()   ==     
                  RUNTIME_CLASS(CStringView)   ?   STRING   :   HEX);   
          pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);   
          RecalcLayout();   
  }   
源码大概是这样,  编译时出现   Create   是保护类型,不可调用。
哪位达人知道怎么create FormView的帮下忙,谢谢。

解决方案 »

  1.   

    自己重载一个view类,把create改为public方式
      

  2.   

    BOOL CUsefulSplitterWnd::ReplaceView(int row, int col,CRuntimeClass * pViewClass,SIZE size)
    {
    CCreateContext context;
    BOOL bSetActive;

    if ((GetPane(row,col)->IsKindOf(pViewClass))==TRUE)
    return FALSE;     

    // Get pointer to CDocument object so that it can be used in the creation 
    // process of the new view
    CDocument * pDoc= ((CView *)GetPane(row,col))->GetDocument();
    CView * pActiveView=GetParentFrame()->GetActiveView();
    if (pActiveView==NULL || pActiveView==GetPane(row,col))
    bSetActive=TRUE;
    else
    bSetActive=FALSE;

        // set flag so that document will not be deleted when view is destroyed
    pDoc->m_bAutoDelete=FALSE;    
        // Delete existing view 
    ((CView *) GetPane(row,col))->DestroyWindow();
        // set flag back to default 
        pDoc->m_bAutoDelete=TRUE; 
        // Create new view   
    context.m_pNewViewClass=pViewClass;
    context.m_pCurrentDoc=pDoc;
    context.m_pNewDocTemplate=NULL;
    context.m_pLastView=NULL;
    context.m_pCurrentFrame=NULL;   
    CreateView(row,col,pViewClass,size, &context);   
    CView * pNewView= (CView *)GetPane(row,col);
    if (bSetActive==TRUE)
    GetParentFrame()->SetActiveView(pNewView);

    RecalcLayout(); 
    GetPane(row,col)->SendMessage(WM_PAINT);

    return TRUE;
    }
      

  3.   

    这个很简单,代码没有问题的话,你看看对应的对话框,将其style改为child,否则是会引发异常的