静态切分窗口怎么切换视图
静态切分窗口怎样切换视图
切分窗口1
最开始右侧编辑框为0,
单击右侧的按钮,编辑框改为输入值,并保存
void CFirstView::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
}
此时,保存的数据为12
单击左侧的按钮2,切换另一视图
在此单击左侧按钮1,显示第一视图,编辑框又重置为0
我这里采用的是DeleteView和CreateView
我想实现切换右侧视图时,视图中原来的数据仍然保存,应该怎样实现?
更进一步,右侧如果一个是子Splitter,一个是普通视图类,怎样保证自己的数据。
有显示和隐藏的函数吗?
------解决方案--------------------
参考:
调用:
pMain->ChangeView(RUNTIME_CLASS(CView4));
------解决方案--------------------
左边用视图类,右边用框架类,在框架里添加视图,使用GetPane保存当前的。
在左侧的view类里保存右边框架视图的指针,成员变量
CRightPaneFrame* m_pRightPaneFrame;
调用右框架的切换视图函数
m_pRightPaneFrame->SwitchToView(nView);
在CRightPaneFrame类中
CRightPaneFrame : public CFrameWnd
函数
切分窗口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);