现在CSplitterWnd中要对某个视图切换出去,让另外一个视图切换近来,不能用DELETEVIEW/CREATEVIEW来实现,因为这样的话,被切换出去的视图里的数据都没有了,不知道如何实现?
分数不够可以加

解决方案 »

  1.   

    不太明白你所谓的切换是什么意思..
    不过数据保存在View中肯定是不规范的,你应该把数据保存在doc中.
      

  2.   

    所谓的切换就是其中一个ListView实例中已经有很多图片,现在要把该视图隐藏掉,用另外一个ListView的实例来显示,关键是如何保存住前一个实例中的图片,以备以后直接切换进来显示
      

  3.   

    最小化?在同一个PANE中难道能出现2个VIEW?我是要把原来的PANE里的VIEW切换出去,把新的VIEW切换近来啊
      

  4.   

    那个pane切分的时候就是指定那个View的你怎么切换?
    换一种思想去处理不是很好
    一个显示一个隐藏 不就达到了你所谓的切换功能了吗?
      

  5.   

    我的VIEW很多,不仅仅是2个VIEW的问题,还有人做过没啊
      

  6.   

    我看过这样的代码,就是所有视图都创建,只把当前的视图SHOW,把别的HIDE就是了啊,这对视图的显示没任何问题,不过你说的数据嘛,老实说,还之存Doc中好点
      

  7.   

    关键是如何保存在DOC类呢?能给点代码吗?
      

  8.   

    视图切换的时候不要删除,用SHOW和HIDE,数据保存到DOC里边使用序列化,如下:
    void CxxxDoc::Serialize(CArchive& ar)
    {
    if (ar.IsStoring())
    {
    ar<<m_nSnowNum<<m_nSnowSpeed<<m_nWindSpeed
    <<m_strWindDirection<<m_strBackGround<<m_bStart;
    for(int i=0;i<m_nSnowNum;i++)
    ar<<Snow[i].m_ptPoint;
    // TODO: add storing code here
    }
    else
    {
    ar>>m_nSnowNum>>m_nSnowSpeed>>m_nWindSpeed
    >>m_strWindDirection>>m_strBackGround>>m_bStart;
    for(int i=0;i<m_nSnowNum;i++)
    ar>>Snow[i].m_ptPoint;
    // TODO: add loading code here
    }
    //   m_SnowList.Serialize(ar);
    }
      

  9.   

    shl6894() :兄弟,能给个简单的例子吗?我的EMAIL:
    [email protected]加我MSN也好
      

  10.   

    帮帮我拉,头都搞疼了,切换的时候不能DELETEVIEW,要隐藏,保存该视图数据,下次切换进来的时候可以快速显示,帮我一下,可以吗?感谢
      

  11.   

    void CSecondSpli::HideColumn(int nColHide)
    {
    ASSERT( m_nCols > 1 );
    ASSERT( nColHide < m_nCols );
    if(m_nHiddenCol != -1 )
    return;
    //记录隐藏列
    m_nHiddenCol = nColHide;    // 如果将被隐藏的子窗口是活动的,则移去其焦点
    int  nActiveCol=0;if(GetActivePane( NULL, &nActiveCol )!=NULL)
    if(nActiveCol==nColHide)
    ActivateNext();//转移活动子窗口//为了简化,仅以一行为例,隐藏该行的nColHide列。如果该拆分器包含多行,必须以循环方式隐藏所有行的nColHide列
    CWnd* pPaneHide = GetPane(0, nColHide);//该拆分器仅包含1行(但包含多列)
    ASSERT( pPaneHide != NULL );
    pPaneHide->ShowWindow(SW_HIDE);//隐藏该列
    pPaneHide->SetDlgCtrlID(ID_HIDE_COLUMN);//重设被隐藏子窗口的ID//记录当前隐藏子窗口的尺寸,以备恢复显示。
    m_pColInfo[m_nCols-1].nCurSize = m_pColInfo[nColHide].nCurSize;//调整隐藏列之后的子窗口的ID号,使剩余子窗口的ID号与其新的显示位置协调一致
    for( int nCol = nColHide + 1; nCol < m_nCols; nCol++ )
    {
    CWnd* pPane = GetPane( 0, nCol );
    ASSERT( pPane != NULL );
    pPane->SetDlgCtrlID( IdFromRowCol( 0, nCol - 1 ));
    m_pColInfo[nCol-1].nCurSize = m_pColInfo[nCol].nCurSize;
    }m_nCols--;//总列数减1
    //重新布置拆分器的客户区,同CFrameWnd:: RecalcLayout()功能相似
    RecalcLayout();
    }void CSecondSpli::ShowColumn()
    {
    ASSERT( m_nCols < m_nMaxCols );
    if( m_nHiddenCol == -1 )
    return;
    int nShowCol = m_nHiddenCol;
    m_nHiddenCol = -1;
    int cxNew = m_pColInfo[m_nCols].nCurSize;//取得隐藏列的原始尺寸(宽度)
    m_nCols++;  // 总列数加1
    int nCol;
    //显示被隐藏的列。如果有多行被隐藏,要进行循环处理
    CWnd* pPaneShow = GetDlgItem(ID_HIDE_COLUMN);
    ASSERT( pPaneShow != NULL );
    pPaneShow->ShowWindow( SW_SHOWNA );
    //调整隐藏列之后的子窗口的ID号,使剩余子窗口的ID号与其新的显示位置协调一致
    for( nCol = m_nCols - 2; nCol >= nShowCol; --nCol )
    {
    CWnd* pPane = GetPane( 0, nCol );//拆分器仅包含一行
    ASSERT( pPane != NULL );
    pPane->SetDlgCtrlID( IdFromRowCol( 0, nCol + 1 ));
    }
    pPaneShow->SetDlgCtrlID( IdFromRowCol( 0, nShowCol ));//恢复标准ID号
        // 调整列信息,使其与新的子窗口位置协调一致
    for( nCol = nShowCol+1; nCol < m_nCols; nCol++ )
    m_pColInfo[nCol].nIdealSize = m_pColInfo[nCol - 1].nCurSize;
    m_pColInfo[nShowCol].nIdealSize = cxNew;
    RecalcLayout();//重新布置拆分器的客户区
    }需要自己继承一个切分类
    写这两个函数再调用这两个函数实现隐藏和切分
      

  12.   

    我继承了CSplitterWnd类,重写了Create函数,为什么执行就ERROR呢
      

  13.   

    我的代码如下,CSplitterView派生于CSplitterWnd类,重写函数如下
    BOOL CSplitterView::Create(CWnd* pParentWnd, int nMaxRows, int nMaxCols, SIZE sizeMin, CCreateContext* pContext, DWORD dwStyle , UINT nID)
    {
    VERIFY(CreateStatic(pParentWnd,1,2,dwStyle,nID));
        VERIFY(CreateView(0, 0, RUNTIME_CLASS(CtestView),
    CSize(200, 0), pContext));
        VERIFY(CreateView(0, 1, RUNTIME_CLASS(CtestView),
    CSize(0, 0), pContext));
    return true;}
    在MainFrame::OnCreateClient()代码如下:
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
    (m_splitter.CreateStatic(this, 2, 1));
    (m_splitter.CreateView(0, 0, RUNTIME_CLASS(CSplitterView),CSize(0,100), pContext));
       (m_splitter.CreateView(1, 0, RUNTIME_CLASS(CSplitterView),CSize(0, 0), pContext));
        return TRUE;
    }为什么一执行就报错啊,