我要创建这样一个程序,刚开始不分割窗口,点击视图上一个按钮后调到下一个页面,页面被分割成两个窗口.
现在看到的资料都是在开始时oncreateclient时就已经分割好了,我想在程序运行中 再分割,而且还能返回分割前的状态

解决方案 »

  1.   

    void CMainFrame::ChangeView(UINT nViewID, void* hint)
    {
    if (nViewID == m_uCurrentViewID)
    {
    return;
    }
    //get old view info
    CView* pOldActiveView = GetActiveView();
    CView* pOldLeftView = NULL;
    if (m_pwndSplitter)
    {
    CWnd* pWnd = m_pwndSplitter->GetPane(0, 0);
    pOldLeftView = STATIC_DOWNCAST(CView, pWnd);
    pWnd = m_pwndSplitter->GetPane(0, 1);
    pOldActiveView = STATIC_DOWNCAST(CView, pWnd);
    }
    //not active anymore, change it's id.
    ::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, m_uCurrentViewID);
    //get new view info, menu, toolbar, and if dialogbar need to be displayed.
    CRuntimeClass* pNewViewClass;
    CRuntimeClass* pNewLeftViewClass;
    switch (nViewID)
    {
    case ID_VIEW_SINGLE:
    pNewViewClass = RUNTIME_CLASS(CSingleView);
    pNewLeftViewClass = NULL;
    break;
    case ID_VIEW_SPLITTED:
    pNewLeftViewClass = RUNTIME_CLASS(CSplittedLeftView);
    pNewViewClass = RUNTIME_CLASS(CSplittedRightView);
    break;
    default:
    ASSERT(0);
    return;
    }
    CSplitterWnd* pOldSplitter = m_pwndSplitter;
    m_pwndSplitter = 0;
    // create the new view
    CCreateContext context;
    context.m_pCurrentDoc = GetActiveDocument();
    if (pNewLeftViewClass)
    {
    m_pwndSplitter = new CSplitterWnd();
    m_pwndSplitter->CreateStatic(this, 1, 2);
    context.m_pNewViewClass = pNewLeftViewClass;
    m_pwndSplitter->CreateView(0, 0, pNewLeftViewClass, CSize(160, 160), &context);
    context.m_pNewViewClass = pNewViewClass;
    m_pwndSplitter->CreateView(0, 1, pNewViewClass, CSize(160, 160), &context);
    m_pwndLeftView = STATIC_DOWNCAST(CNaviTreeView, m_pwndSplitter->GetPane(0, 0));
    //set the initial hint
    m_pwndLeftView->SetInitialNaviHint(hint);
    m_pwndLeftView->ShowWindow(SW_SHOW);
    m_pwndLeftView->OnInitialUpdate(); m_pwndRightView = STATIC_DOWNCAST(CView, m_pwndSplitter->GetPane(0, 1));
    }
    else
    {
    m_pwndLeftView = NULL;
    context.m_pNewViewClass = pNewViewClass;
    m_pwndRightView = STATIC_DOWNCAST(CView, CreateView(&context));
    }
    m_pwndRightView->ShowWindow(SW_SHOW);
    m_pwndRightView->OnInitialUpdate();
    SetActiveView(m_pwndRightView);
    RecalcLayout();
    m_uCurrentViewID = nViewID; // destroy old views after new view created. or the doc would be closed
    if (pOldSplitter)
    {
    pOldLeftView->DestroyWindow();
    pOldActiveView->DestroyWindow();
    pOldSplitter->DestroyWindow();
    delete pOldSplitter;
    }
    else
    {
    pOldActiveView->DestroyWindow();
    }
    }
      

  2.   

    在点击第一个页面调出另个一页面同事把第一个页面隐藏起来  在你另外一个页面写入oncreateclient  把第二个页面分割在你关掉另一个页面时把第一个页面显示出来!
      

  3.   

    http://blog.csdn.net/visualeleven/article/details/6460564
      

  4.   

    动态改变分割窗口。
    看看我的ChangeSplit.zip(要1分)
      

  5.   

    分割窗口基本没有问题了,就是我在主框架切换视图的时候,视图的ondraw函数不会被自动调用,我想知道 怎样让切换后的view自动调用ondraw绘图,我是这样切分窗口的void CMainFrame::switchform(int  nID)
    {CView *pOldActiveView=GetActiveView();             //保存旧视图
    CView *pNewActiveView=(CView*)GetDlgItem(nID);   //取得新视图 if(pNewActiveView==NULL)
     {  switch(nID)
    //这些ID是对话框的标志符,但也可以用其他的标志
    {
    case IDD_DIALOG1 :
    pNewActiveView=(CView*)new dlgview;
    break;
    case IDD_DIALOG2 :
    pNewActiveView=(CView*)new dlgview2;
    break;
    case IDD_DIALOG5 :
    pNewActiveView=(CView*)new dlgview22;
    break;
    case IDD_DIALOG4 :
    pNewActiveView=(CView*)new dlgview4;
    break;
    } CCreateContext context;   //将文挡和视图相连
    context.m_pCurrentDoc=pOldActiveView->GetDocument();
    //rect=CFrameWnd::rectDefault; pNewActiveView->Create(NULL, NULL, WS_CHILD|WS_VISIBLE ,
     CFrameWnd::rectDefault, this, nID, &context);
    //context.m_pNewViewClass=RUNTIME_CLASS(dlgview2);
    pNewActiveView->OnInitialUpdate();
     }  SetActiveView(pNewActiveView);        //改变活动的视图
     pNewActiveView->ShowWindow(SW_SHOW);  //显示新的视图
     pOldActiveView->ShowWindow(SW_HIDE);  //隐藏旧的视图if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(dlgview))
     pOldActiveView->SetDlgCtrlID(IDD_DIALOG1); else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(dlgview2))
     pOldActiveView->SetDlgCtrlID(IDD_DIALOG2); else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(dlgview22))
     pOldActiveView->SetDlgCtrlID(IDD_DIALOG5);
     else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(dlgview4))
     pOldActiveView->SetDlgCtrlID(IDD_DIALOG4);
    int nSwitchChildID = pNewActiveView->GetDlgCtrlID();
    pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    //pNewActiveView->SetDlgCtrlID(nSwitchChildID);
    delete pOldActiveView;   //删除旧视图 RecalcLayout();          //调整框架窗口
    }
      

  6.   

    是不是在initinstance里切换就不会出现这样的问题?求方法