静态切分窗口怎么切换视图

静态切分窗口怎样切换视图
切分窗口1
静态切分窗口怎么切换视图
最开始右侧编辑框为0,
单击右侧的按钮,编辑框改为输入值,并保存

void CFirstView::OnButton1() 
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);

}
静态切分窗口怎么切换视图
此时,保存的数据为12
单击左侧的按钮2,切换另一视图
静态切分窗口怎么切换视图
在此单击左侧按钮1,显示第一视图,编辑框又重置为0
静态切分窗口怎么切换视图

我这里采用的是DeleteView和CreateView

void CMainFrame::OnSwitchToSecond()
{
m_wndSplitter.DeleteView(0,1);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CSecondView), CSize(0,0),NULL);
m_wndSplitter.RecalcLayout();
}

我想实现切换右侧视图时,视图中原来的数据仍然保存,应该怎样实现?
更进一步,右侧如果一个是子Splitter,一个是普通视图类,怎样保证自己的数据。
有显示和隐藏的函数吗?

------解决方案--------------------
参考:

//
BOOL CMainFrame::ChangeView(CRuntimeClass *pNewViewClass)
{
CCreateContext Context;// I hate 'new'
ZeroMemory(&Context,sizeof(Context));
Context.m_pCurrentFrame=this;
Context.m_pCurrentDoc=GetActiveDocument();
//
CRect rect;
GetClientRect(&rect);
CSize size=rect.Size();
size.cx /= 2;// col
size.cy /= 3;// row
//
int Row,Col;
m_wndSplitter2.LockWindowUpdate();
//
m_wndSplitter2.GetActivePane(&Row,&Col);
m_wndSplitter2.DeleteView(Row,Col);// focus move to next !
m_wndSplitter2.CreateView(Row,Col,pNewViewClass,size,&Context);
m_wndSplitter2.RecalcLayout();
// send 'InitialUpdate' to view
InitialUpdateFrame(NULL,TRUE);
// no flush
m_wndSplitter2.SetActivePane(Row,Col);
//
m_wndSplitter2.UnlockWindowUpdate();
//
return TRUE;
}

调用:
pMain->ChangeView(RUNTIME_CLASS(CView4));

------解决方案--------------------
左边用视图类,右边用框架类,在框架里添加视图,使用GetPane保存当前的。
在左侧的view类里保存右边框架视图的指针,成员变量
CRightPaneFrame* m_pRightPaneFrame;

CLeftPaneView* pLeftPaneView     = (CLeftPaneView*)   m_wndSplitter.GetPane(0,0);
pLeftPaneView->m_pRightPaneFrame = (CRightPaneFrame*) m_wndSplitter.GetPane(0,1);

// Set the left pane as the active view
SetActiveView((CView*) m_wndSplitter.GetPane(0, 0));

调用右框架的切换视图函数
m_pRightPaneFrame->SwitchToView(nView);
在CRightPaneFrame类中
CRightPaneFrame : public CFrameWnd

// Attributes
public:
CSplitterView* m_pSplitterView;
CListCtrlView* m_pListCtrlView;
CEditCtrlView* m_pEditCtrlView;
UINT           m_nCurrentViewID;

函数

BOOL CRightPaneFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
// TODO: Add your specialized code here and/or call the base class

m_pSplitterView = new CSplitterView;
m_pSplitterView->Create(NULL, NULL, 0L, CFrameWnd::rectDefault, this, VIEW_SPLITTER, pContext);
SetActiveView(m_pSplitterView);
m_pSplitterView->ShowWindow(SW_SHOW);
m_pSplitterView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_nCurrentViewID = VIEW_SPLITTER;

m_pListCtrlView = new CListCtrlView;
((CView*) m_pListCtrlView)->Create(NULL, NULL, 0L, CFrameWnd::rectDefault, this, VIEW_LISTCTRL, pContext);
m_pListCtrlView->ShowWindow(SW_HIDE);
m_pListCtrlView->SetDlgCtrlID(VIEW_LISTCTRL);

m_pEditCtrlView = new CEditCtrlView;
((CView*) m_pEditCtrlView)->Create(NULL, NULL, 0L, CFrameWnd::rectDefault, this, VIEW_EDIT, pContext);
m_pEditCtrlView->ShowWindow(SW_HIDE);
m_pEditCtrlView->SetDlgCtrlID(VIEW_EDIT);


RecalcLayout();

return TRUE;
}

void CRightPaneFrame::SwitchToView(UINT nView)
{
CView* pOldActiveView = GetActiveView();
CView* pNewActiveView = NULL;

switch (nView)
{
case VIEW_SPLITTER:
pNewActiveView = (CView*) m_pSplitterView;
break;

case VIEW_LISTCTRL:
pNewActiveView = (CView*) m_pListCtrlView;
break;
case VIEW_EDIT:
pNewActiveView = (CView*) m_pEditCtrlView;
break;
}

if (pNewActiveView)
{
// don't switch when views are the same
if (pOldActiveView == pNewActiveView) return;

SetActiveView(pNewActiveView);