您的位置:首页 > 其它

单文档多视图切换的解决办法

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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: