Doc/View结构中的多视图的切换

本文介绍了两种视图切换的方法:一种适用于多文档、多视图环境,通过定位目标视图并激活相应的窗口来完成切换;另一种适用于单文档、多视图场景,通过创建新的视图类实例,并设置为活动视图实现切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多文档、多视图的切换

void  CMainFrame::SwitchView(CMultiDocTemplate *  pDocTemplate)
{
    CDocument
* pDoc = NULL;
    POSITION pos    
= pDocTemplate->GetFirstDocPosition();
    CView
* pActiveView      = GetActiveFrame()->GetActiveView();

    
if( pos == NULL )
    
{
        
// create new document
        pDoc = (CTouchNetDoc*)pDocTemplate->OpenDocumentFile(NULL);
    }

    
else
    
{
        
while (pos) 
        
{
            
// get the document object
            pDoc = pDocTemplate->GetNextDoc(pos);
            POSITION pos2 
= pDoc->GetFirstViewPosition();
            
if (pos2) 
            
{
                CView 
*pView = pDoc->GetNextView(pos2);
                CFrameWnd
* pNewFrame = pView->GetParentFrame();

                ASSERT(pNewFrame);
                
if ( pNewFrame->GetParentFrame() == this )
                    
break;
            }

        }


        
if ( pDoc == NULL )
            pDoc 
= (CTouchNetDoc*)pDocTemplate->OpenDocumentFile(NULL);
    }


    
// find the target view object of pDoc
    CView *pTargetView = NULL;
    pos 
= pDoc->GetFirstViewPosition();
    
while (pos) 
    
{
        CView 
*pView = pDoc->GetNextView(pos);
        
if ( pView )
        
{
            pTargetView 
= pView;
            
break;
        }

    }


    
if (pTargetView)
    
{
        
if ( pActiveView != pTargetView )
        
{
            
// show the frame window of target view.
            CFrameWnd* pNewFrame = (CFrameWnd* )pTargetView->GetParentFrame();
            pNewFrame
->ActivateFrame();
            pNewFrame
->SetActiveView(pTargetView);
            
            pTargetView
->OnInitialUpdate();
            
//call pTargetView to do something
        }

    }

}

 

单文档、多视图的切换

void  CMainFrame::SwitchView( const   int  nViewId)
{
    CView
* pOldView      = GetActiveView();
    CDocument
* pDoc = pOldView->GetDocument();

    CCreateContext context;
    context.m_pCurrentDoc 
= pDoc;
    CView
* pNewView = NULL;

    
switch(nViewId)
    
{
    
case eBrowseView:
        context.m_pNewViewClass 
= RUNTIME_CLASS(CBView1);
        
break;

    
case eHttpView:
        context.m_pNewViewClass 
= RUNTIME_CLASS(CView2);
        
break;

    
default:
        
break;
    }


    pNewView 
= (CView*)CreateView(&context);
    SetActiveView(pNewView);
    pNewView
->ShowWindow(SW_SHOW);
    pOldView
->ShowWindow(SW_HIDE);

    
// call pNewView to do something 

    pOldView
->DestroyWindow();

    RecalcLayout();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值