单文档多视图切换的解决办法
2010-03-31 19:16
267 查看
由于最近做的一个程序用到了单文档多视图切换,所以把它总结一下。内容如下:
单文档多视图的切换有两种情况,即分栏多视图切换和无分栏多视图切换,以下是两个对应情况的可重用函数:
分栏多视图切换:
Code:
BOOL CMainFrame::ReplaceView(int row, int col, CRuntimeClass *pViewClass, SIZE size)
{
CCreateContext context;
BOOL bSetActive;
if ((this->m_wndSplitter.GetPane(row,col)->IsKindOf(pViewClass))==TRUE)
return FALSE;
//获取文档对象的指针,以便在创建新视图的过程中能够使用它
CDocument * pDoc= ((CView *)m_wndSplitter.GetPane(row,col))->GetDocument();
CView * pActiveView=this->GetActiveView();
if (pActiveView==NULL || pActiveView==m_wndSplitter.GetPane(row,col))
bSetActive=TRUE;
else
bSetActive=FALSE;
pDoc->m_bAutoDelete=FALSE; //设置标志,这样当视图销毁时不会删除文档
((CView *) m_wndSplitter.GetPane(row,col))->DestroyWindow(); //删除存在的视图
pDoc->m_bAutoDelete=TRUE; //设回默认的标志
//创建新视图
context.m_pNewViewClass=pViewClass;
context.m_pCurrentDoc=pDoc;
context.m_pNewDocTemplate=NULL;
context.m_pLastView=NULL;
context.m_pCurrentFrame=NULL;
m_wndSplitter.CreateView(row,col,pViewClass,size, &context);
CView * pNewView= (CView *)m_wndSplitter.GetPane(row,col);
if (bSetActive==TRUE)
this->SetActiveView(pNewView);
m_wndSplitter.RecalcLayout();
//重新计算位置
pNewView->OnInitialUpdate(); //调用初始化函数
return TRUE;
}
无分栏多视图切换
Code:
BOOL CMainFrame::ReplaceView(CRuntimeClass *pViewClass)
{
CCreateContext context;
CDocument *pDoc = GetActiveView()->GetDocument();
//销毁先前的视图窗口
pDoc->m_bAutoDelete = FALSE;
GetActiveView()->DestroyWindow();
pDoc->m_bAutoDelete = TRUE;
//创建新视图
context.m_pNewViewClass = pViewClass;
context.m_pCurrentDoc = pDoc;
context.m_pNewDocTemplate = NULL;
context.m_pLastView = NULL;
context.m_pCurrentFrame = NULL;
CView *pNewView = (CView *)this->CreateView(&context);
//设置新视图为活动状态
this->SetActiveView(pNewView);
RecalcLayout();
//初始化新视图
pNewView->OnInitialUpdate();
return TRUE;
}
两种情况的原理一样,差别只在创建新视图后视图指针的获取。一般情况下,这两个函数当中的一个放在CMainFrame里,然后在相应的响应函数里获得主窗口的指针来调用。例如单文档无分栏情况下已经继承实现了一个视图类CDeviceTabView,切换视图的方法为:
Code:
//获得主窗口指针
CMainFrame *pFram = (CMainFrame *)AfxGetMainWnd();
//切换视图
pFram->ReplaceView(RUNTIME_CLASS(CDeviceTabView));
OK,这样就好了,希望以上内容与你有所帮助,Good luck!
单文档多视图的切换有两种情况,即分栏多视图切换和无分栏多视图切换,以下是两个对应情况的可重用函数:
分栏多视图切换:
Code:
BOOL CMainFrame::ReplaceView(int row, int col, CRuntimeClass *pViewClass, SIZE size)
{
CCreateContext context;
BOOL bSetActive;
if ((this->m_wndSplitter.GetPane(row,col)->IsKindOf(pViewClass))==TRUE)
return FALSE;
//获取文档对象的指针,以便在创建新视图的过程中能够使用它
CDocument * pDoc= ((CView *)m_wndSplitter.GetPane(row,col))->GetDocument();
CView * pActiveView=this->GetActiveView();
if (pActiveView==NULL || pActiveView==m_wndSplitter.GetPane(row,col))
bSetActive=TRUE;
else
bSetActive=FALSE;
pDoc->m_bAutoDelete=FALSE; //设置标志,这样当视图销毁时不会删除文档
((CView *) m_wndSplitter.GetPane(row,col))->DestroyWindow(); //删除存在的视图
pDoc->m_bAutoDelete=TRUE; //设回默认的标志
//创建新视图
context.m_pNewViewClass=pViewClass;
context.m_pCurrentDoc=pDoc;
context.m_pNewDocTemplate=NULL;
context.m_pLastView=NULL;
context.m_pCurrentFrame=NULL;
m_wndSplitter.CreateView(row,col,pViewClass,size, &context);
CView * pNewView= (CView *)m_wndSplitter.GetPane(row,col);
if (bSetActive==TRUE)
this->SetActiveView(pNewView);
m_wndSplitter.RecalcLayout();
//重新计算位置
pNewView->OnInitialUpdate(); //调用初始化函数
return TRUE;
}
无分栏多视图切换
Code:
BOOL CMainFrame::ReplaceView(CRuntimeClass *pViewClass)
{
CCreateContext context;
CDocument *pDoc = GetActiveView()->GetDocument();
//销毁先前的视图窗口
pDoc->m_bAutoDelete = FALSE;
GetActiveView()->DestroyWindow();
pDoc->m_bAutoDelete = TRUE;
//创建新视图
context.m_pNewViewClass = pViewClass;
context.m_pCurrentDoc = pDoc;
context.m_pNewDocTemplate = NULL;
context.m_pLastView = NULL;
context.m_pCurrentFrame = NULL;
CView *pNewView = (CView *)this->CreateView(&context);
//设置新视图为活动状态
this->SetActiveView(pNewView);
RecalcLayout();
//初始化新视图
pNewView->OnInitialUpdate();
return TRUE;
}
两种情况的原理一样,差别只在创建新视图后视图指针的获取。一般情况下,这两个函数当中的一个放在CMainFrame里,然后在相应的响应函数里获得主窗口的指针来调用。例如单文档无分栏情况下已经继承实现了一个视图类CDeviceTabView,切换视图的方法为:
Code:
//获得主窗口指针
CMainFrame *pFram = (CMainFrame *)AfxGetMainWnd();
//切换视图
pFram->ReplaceView(RUNTIME_CLASS(CDeviceTabView));
OK,这样就好了,希望以上内容与你有所帮助,Good luck!
相关文章推荐
- 单文档多视图切换的解决办法
- 单文档多视图切换的解决办法
- 单文档多视图切换的解决办法
- vs 2008 不能切换到设计视图的解决办法
- VS2008切换设计视图假死的解决办法
- VS2008切换设计视图假死的解决办法
- Visual Studio 2008切换到设计视图卡死解决办法-Troubleshooting "Visual Studio 2008 Design view hangs" issues
- MFC 文档视图学习笔记----list控件标题乱码解决办法
- vs 2008 不能切换到设计视图的解决办法
- Lotus视图中“未找到文档”的解决办法
- 母版页嵌套无法切换到"视图"状态的解决办法
- vs2008切换设计视图就卡死的解决办法
- VS2005中无法从源视图切换到设计视图解决办法
- vs 2008 不能切换到设计视图的解决办法
- VS2008切换设计视图假死的解决办法
- vs 2008 不能切换到设计视图的解决办法
- Microsoft Visual Studio 2008 页面切换视图时假死状态解决办法
- vs 2008 不能切换到设计视图的解决办法 ----十分有效
- VS2008切换设计视图假死的解决办法
- vs 2008 不能切换到设计视图的解决办法