见标题

解决方案 »

  1.   

    //in MainFrm.h
    CSplitterWnd m_wndSplitter1;
    CSplitterWnd m_wndSplitter2;
    //CMyTreeView::CFormView,CFileListForm::CFormView,CItemAttrForm::CFormView
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
    CRect rect;
    GetClientRect(&rect);
    if( !m_wndSplitter1.CreateStatic( this, 1, 2 ) ) 
    return FALSE;
    if( !m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CMyTreeView), CSize(0,0), pContext) )
    return FALSE;
    if( !m_wndSplitter2.CreateStatic( &m_wndSplitter1, 2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0,1) ) )
    return FALSE;
    if( !m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CFileListForm), CSize(0,0), pContext) )
    return FALSE;
    if( !m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CItemAttrForm), CSize(0,0), pContext) )
    return FALSE;
    }
    //以上可以生成比较经典的分割视图 
         |
         |
         |_______________
         |
         | 
         |
    //换左边的视图CNewView::CFormView
    m_wndSplitter1.DeleteView(0,0);
    if( !m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CNewView), CSize(0,0), pContext) )
      

  2.   

    可以用隐藏的方式来进行切换。给我发邮件,我给你个例子。我在我的程序中已经应用起来了。
    [email protected]
      

  3.   

    参考MFC精典问答FAQ3.8//1.查找要替换的视图//2.保存当前视图的位置和活动状态//3.查找相关的文档//4.当释放活动视图时,确保文档不会自动析构//5.释放活动视图//6.恢复文档到初始状态//7.初始化CreateView使用的创建上下文//8.创建新的视图//9.定位新视图//10.给视图发送WM_INITIALUPDATE消息
      

  4.   

    可以使用一个隐藏/显示某页的splitterwnd来控制
      

  5.   

    参考view/doc框架,以及相互协作关系,推荐看《深入解析MFC》(虽然是MFC4.0的)另外你说的切换在msdn中有源代码!哈哈,自己找吧!
      

  6.   

    SetActiveView((CView*)m_wndCDlabel.GetPane(0,0));
      

  7.   

    多谢各位的指点,我终于找到了办法,在这里与大家分享,各位有什么好的建议请提出,本贴咱不结贴。BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
    CRect rect;
    GetClientRect(&rect);
    m_pWndSplitter1 = new CCJFlatSplitterWnd();
    m_pWndSplitter2 = new CCJFlatSplitterWnd();
    if( !m_pWndSplitter1->CreateStatic( this, 1, 2 ) ) 
    return FALSE;
    if( !m_pWndSplitter1->CreateView(0, 0, RUNTIME_CLASS(CSubStationServerLeftView), CSize(100,0), pContext) )
    return FALSE;
    if( !m_pWndSplitter2->CreateStatic( m_pWndSplitter1, 1, 2, WS_CHILD | WS_VISIBLE, m_pWndSplitter1->IdFromRowCol(0,1) ) )
    return FALSE;
    if( !m_pWndSplitter2->CreateView(0, 0, RUNTIME_CLASS(CSubStationTreeView), CSize(100,0), pContext) )
    return FALSE;
    if( !m_pWndSplitter2->CreateView(0, 1, RUNTIME_CLASS(CSubStationListView), CSize(100,0), pContext) )
    return FALSE;

    return TRUE;
    }
    void CMainFrame::SwitchView(enum CMainFrame::eView eView)
    {

    CSubStationServerLeftView * pLeftView = (CSubStationServerLeftView * )m_pWndSplitter1->GetPane(0,0);
    if (pLeftView == NULL)
    return;
    CCreateContext context;
    context.m_pCurrentDoc = pLeftView->GetDocument();

    switch(eView)
    {
    case EVIEWUSER
    {
    CWnd * pWnd = m_pWndSplitter1->GetPane(0,1);
    if (pWnd != NULL)
    {
    if (pWnd->IsKindOf(RUNTIME_CLASS(CSplitterWnd)))
    {
    delete pWnd;
    m_pWndSplitter2 = NULL;
    if( !m_pWndSplitter1->CreateView(0, 1, RUNTIME_CLASS(CUserListView), CSize(100,0), &context) )
    return;
    }
    else if (pWnd->IsKindOf(RUNTIME_CLASS(CUserListView)))
    break;
    }
    m_pWndSplitter1->RecalcLayout( );
    }
    break;
    case EVSUBSTATION
    {
    CWnd * pWnd = m_pWndSplitter1->GetPane(0,1);
    if (pWnd != NULL)
    {
    if (pWnd->IsKindOf(RUNTIME_CLASS(CSplitterWnd)))
    {
    delete pWnd;
    m_pWndSplitter2 = NULL;
    }
    else if (pWnd->IsKindOf(RUNTIME_CLASS(CUserListView)))
    delete pWnd;
    }
    m_pWndSplitter2 = new CCJFlatSplitterWnd();
    if( !m_pWndSplitter2->CreateStatic( m_pWndSplitter1, 1, 2, WS_CHILD | WS_VISIBLE, m_pWndSplitter1->IdFromRowCol(0,1) ) )
    return;
    if( !m_pWndSplitter2->CreateView(0, 0, RUNTIME_CLASS(CSubStationTreeView), CSize(100,0), &context) )
    return;
    if( !m_pWndSplitter2->CreateView(0, 1, RUNTIME_CLASS(CSubStationListView), CSize(100,0), &context) )
    return;
    m_pWndSplitter1->RecalcLayout( );
    }
        break;
    case EVIED
        break;
    case EVDICT:
        break;
    default:
    ASSERT(FALSE);
    }}
    ////以次方便可以实现复杂的分割、切换