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

whucv 2012-08-16 12:20:52
切分窗口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,一个是普通视图类,怎样保证自己的数据。
有显示和隐藏的函数吗?
...全文
327 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
silentcard 2013-10-24
  • 打赏
  • 举报
回复
谢谢4L和LZ,我也遇到这个问题,照着4L的方法解决啦
whucv 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
我也要实现这种切换...3楼那个要保存数据有点悬吧,不知道4楼的楼主测试成功没有?
[/Quote]

可以用这种方法
  • 打赏
  • 举报
回复
我也要实现这种切换...3楼那个要保存数据有点悬吧,不知道4楼的楼主测试成功没有?
  • 打赏
  • 举报
回复
运行m_pSplitterView->Create(NULL, NULL, 0L, CFrameWnd::rectDefault,
this, VIEW_SPLITTER, pContext);时出现以下错误:
cannot access protected member declared in class 'CFormView'是怎么回事呢 我都已经把CFormView权限改为public了
whucv 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
4楼把偶的想法实现了下,偶一分没有,看来下次不说思路了,上代码才是硬道理
[/Quote]
没有分数并不是因为你没有上代码,而是你没有针对我的提问回答,我的标题是“静态切分窗口怎样切换视图”,我需要的是“切换视图和保存切换过程中保存视图中的数据”这个功能,从你的回答中我看不出哪里涉及切换视图。

另外,把信息全保留在左边视图中你说的不准确,不是视图中的信息进行传递,而是要保留视图对象。
也不是把左边指针传递给右边指针。
傻X 2012-08-16
  • 打赏
  • 举报
回复
重复贴??

你如果想达到这样的效果还不如把信息全保留在左边视图中,毕竟右边视觉会变换。

在CMainFrm初始化的时候,记得把左边视图的指针传给右边视图,让数据右边视图把数据放入左边。

初始化的时候没数据,就把空的附过去,有数据就把实际内容附过去。
傻X 2012-08-16
  • 打赏
  • 举报
回复
4楼把偶的想法实现了下,偶一分没有,看来下次不说思路了,上代码才是硬道理
mastercode 2012-08-16
  • 打赏
  • 举报
回复
左边用视图类,右边用框架类,在框架里添加视图,使用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);
pNewActiveView->ShowWindow(SW_SHOW);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
pOldActiveView->ShowWindow(SW_HIDE);
pOldActiveView->SetDlgCtrlID(m_nCurrentViewID);
m_nCurrentViewID = nView;

RecalcLayout();
}
}


schlafenhamster 2012-08-16
  • 打赏
  • 举报
回复
参考:

//
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));
九月_leaf 2012-08-16
  • 打赏
  • 举报
回复
采用父子窗口的模式。。 小对话框属性
Style Child
主对话框
Style Popup

主对话框:

CRect m_PageRect;
tt* m_tt;
if(m_tt == NULL)
{
m_tt = new tt;

if(m_tt != NULL)
{
m_tt->Create(IDD_DIALOG3,this);
m_tt->MoveWindow(m_PageRect.left,m_PageRect.top,m_PageRect.Width(),m_PageRect.Height());
m_tt->ShowWindow(SW_HIDE);
m_tt->InitWnd(this);
}
}

m_tt->ShowWindow(SW_SHOW);

小对话框:
CWnd* m_pMainWnd;
void tt::InitWnd(CWnd* pParent)
{
m_pMainWnd = pParent;
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧