void ChangeFrameView(CFrameWnd *pFrame, CRuntimeClass *pNewView)
{
ASSERT(pFrame);
ASSERT(pNewView);
// 获取当前视图
CView* pCurrentView = pFrame->GetActiveView();
// 保存当前视图位置
CRect rcView;
pCurrentView->GetWindowRect(&rcView);
// 获得当前视图相关的文档
CDocument* pDoc;
pDoc = pCurrentView->GetDocument();
// 保持文挡状态,防止释放视图的时候自动释放掉
BOOL bSaveDocument = pDoc->m_bAutoDelete;
pDoc->m_bAutoDelete = FALSE;
// 释放当前视图
pCurrentView->DestroyWindow();
// 恢复文挡状态创建新的上下文
pDoc->m_bAutoDelete = bSaveDocument;
//创建新的上下文
CCreateContext context;
context.m_pCurrentFrame = NULL;
context.m_pLastView = NULL;
context.m_pNewDocTemplate = NULL;
context.m_pCurrentDoc = pDoc;
context.m_pNewViewClass = pNewView;
// 创建视图
CView* pNewCreateView =static_cast
<CView*>(pFrame->CreateView(&context));
// 移动视图到原来视图位置
pFrame->ScreenToClient(&rcView);
pNewCreateView->MoveWindow(&rcView);
// 更新
pFrame->InitialUpdateFrame(pDoc, TRUE);
}
{
ASSERT(pFrame);
ASSERT(pNewView);
// 获取当前视图
CView* pCurrentView = pFrame->GetActiveView();
// 保存当前视图位置
CRect rcView;
pCurrentView->GetWindowRect(&rcView);
// 获得当前视图相关的文档
CDocument* pDoc;
pDoc = pCurrentView->GetDocument();
// 保持文挡状态,防止释放视图的时候自动释放掉
BOOL bSaveDocument = pDoc->m_bAutoDelete;
pDoc->m_bAutoDelete = FALSE;
// 释放当前视图
pCurrentView->DestroyWindow();
// 恢复文挡状态创建新的上下文
pDoc->m_bAutoDelete = bSaveDocument;
//创建新的上下文
CCreateContext context;
context.m_pCurrentFrame = NULL;
context.m_pLastView = NULL;
context.m_pNewDocTemplate = NULL;
context.m_pCurrentDoc = pDoc;
context.m_pNewViewClass = pNewView;
// 创建视图
CView* pNewCreateView =static_cast
<CView*>(pFrame->CreateView(&context));
// 移动视图到原来视图位置
pFrame->ScreenToClient(&rcView);
pNewCreateView->MoveWindow(&rcView);
// 更新
pFrame->InitialUpdateFrame(pDoc, TRUE);
}
本文介绍了一种在MFC应用程序中实现视图切换的方法。通过`ChangeFrameView`函数,可以实现在不同视图之间的平滑切换。该过程包括获取当前视图、保存其位置、释放旧视图、创建新视图并将其移动到原来的位置,最后更新窗口布局。
5800

被折叠的 条评论
为什么被折叠?



