如何在带分割窗口的单文档多视图中切换视图(保留原来视图的内容)

InwIvled 2006-10-02 03:02:43
界面为左边在一个Tree中选择,右边显示相应的视图,要求能保留视图内容,从而在切回上次视图时,原来的内容还在。
...全文
586 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
raymonzhao 2006-10-09
  • 打赏
  • 举报
回复
视图的内容本来就是从文档来的.所以,只要在每个视图的初始化时读取相应的文档中的内容,就可达到想要的操作了.新建视图和切换视图其实没有什么很大的差别.五星高手的实现还是非常详细和严谨的,我的系统中也是差不多的实现.
daiybh 2006-10-09
  • 打赏
  • 举报
回复
daiybh@gmail.com
某鸟 2006-10-09
  • 打赏
  • 举报
回复
MSDN里有个例子,继承扩展了一个CSpitterWnd的类……
下面是偶根据那个例子的代码改的……
各位老大可以帮忙挑挑错……刚写完,初步测试没问题,至于有没有内存泄漏没细看呐……
BOOL CSplitterWndEx::ReplaceView(int row, int col,
CRuntimeClass * pViewClass,
SIZE size,
UINT vFrom, UINT vTo)
{
CCreateContext context;
BOOL bSetActive;

if ((GetPane(row,col)->IsKindOf(pViewClass))==TRUE)
return FALSE;

// Get pointer to CDocument object so that it can be used in the creation
// process of the new view
CDocument * pDoc = ((CView*)GetPane(row,col))->GetDocument();
CView * pActiveView = GetParentFrame()->GetActiveView();

if (pActiveView == NULL || pActiveView == GetPane(row,col))
bSetActive = TRUE;
else
bSetActive = FALSE;

// Create new view
pActiveView = ((CView *) GetPane(row, col));
if(pActiveView){
pActiveView->SetDlgCtrlID(vFrom);
pActiveView->ShowWindow(SW_HIDE);
}

pActiveView = (CView *)GetDlgItem(vTo);
if(pActiveView){
pActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
pActiveView->ShowWindow(SW_SHOW);
}
else{
context.m_pNewViewClass = pViewClass;
context.m_pCurrentDoc = pDoc;
context.m_pNewDocTemplate = NULL;
context.m_pLastView = NULL;
context.m_pCurrentFrame = NULL;

CreateView(row, col, pViewClass,size, &context);
((CView*)GetPane(row,col))->OnInitialUpdate();
}

if (bSetActive == TRUE){
CView* pNewView = (CView*)GetPane(row,col);
GetParentFrame()->SetActiveView(pNewView);
}

RecalcLayout();
return TRUE;
}
最后两个参数是定义的枚举,参照 vc6 技术内幕里的实现……
heartofautumn 2006-10-08
  • 打赏
  • 举报
回复
说不清楚 给我家小猪做过的一个程序和你的要求一样 要的话留个邮箱
某鸟 2006-10-08
  • 打赏
  • 举报
回复
真糗~

才想起来,那个函数原来是自定义的……算我没说……呜~
某鸟 2006-10-08
  • 打赏
  • 举报
回复
可以做下判断啊~:如果要切换到的视图已存在的话,就直接替换,否则,新建一个,再切换……

不过偶记得如果是静态切分的话好像是要用ReplaceView而不是CreateView呐!……
InwIvled 2006-10-02
  • 打赏
  • 举报
回复
用CreateView不是会重新创建视图吗,如果再切回该视图,不是原有内容就没了,如何保留视图中的现有的内容
DentistryDoctor 2006-10-02
  • 打赏
  • 举报
回复
那么需要将视图的指针作为ItemData与TreeItem进行关联。


///////////////////////////////////////////////////////////
// Replace the current view in the splitter pSplitter
// at pane (row, col) by a new view of class pViewClass

void SwitchViewInSplitter( CSplitterWnd* pSplitter,
int row, int col,
CRuntimeClass* pViewClass )
{
ASSERT_VALID( pSplitter );
ASSERT( pViewClass != NULL );

ASSERT( pViewClass->
IsDerivedFrom( RUNTIME_CLASS( CView ) ) );

// 1 - Find the view to be replaced
CWnd* pPaneWnd = pSplitter->GetPane( row, col );
if( !pPaneWnd->IsKindOf( RUNTIME_CLASS( CView ) ) )
{
TRACE2( "Unable to switch: pane (%d,%d) is not a view\n",
row, col );
return;
}

CView* pCurrentView = static_cast<CView*>( pPaneWnd );
ASSERT_VALID( pCurrentView );
ASSERT_KINDOF( CView, pCurrentView );

if( pCurrentView->IsKindOf( pViewClass ) )
{
// No need to switch for same view class
return;
}

// 2 - Store current view position and activation state
CRect rcView;
pCurrentView->GetWindowRect( &rcView );

CView* pActiveView = pSplitter->
GetParentFrame()->GetActiveView();
BOOL bSaveActive = ( pActiveView == NULL )
|| ( pActiveView == pCurrentView );

// 3 - Find the associated document
CDocument* pDoc = pCurrentView->GetDocument();
ASSERT_VALID( pDoc );

// 4 - Make sure the document won't self-destruct
// when current view is destroyed
BOOL bSaveAutoDelete = pDoc->m_bAutoDelete;
pDoc->m_bAutoDelete = FALSE;

// 5 - Hide CurrentView

// 6 - Restore document to initial state
pDoc->m_bAutoDelete = bSaveAutoDelete;

// 7 - Initialize creation context used by CreateView()
CCreateContext context;
context.m_pNewDocTemplate = NULL;
context.m_pLastView = NULL;
context.m_pCurrentFrame = NULL;

context.m_pNewViewClass = pViewClass;
context.m_pCurrentDoc = pDoc;

// 8 - Create the new view
pSplitter->CreateView( row, col, pViewClass,
rcView.Size(), &context );

CView* pNewView = static_cast<CView*>
( pSplitter->GetPane( row, col ) );
ASSERT_VALID( pNewView );
ASSERT_KINDOF( CView, pNewView );

// 9 - Position the new view like the old one and
// activate it if needed
pSplitter->ScreenToClient( &rcView );
pNewView->MoveWindow( &rcView, TRUE );
if( bSaveActive )
{
pSplitter->GetParentFrame()->SetActiveView( pNewView );
}

// 10 - Send WM_INITIALUPDATE to the view
pNewView->GetParentFrame()->InitialUpdateFrame( pDoc, TRUE );
}

15,979

社区成员

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

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