如何动态地切换MDI子窗口或者在SDI主应用程序窗口显示的视图?

 

              谁说过一个框架窗口在整个生存期内都应该受其关联的视图的束缚呢?在用户接口中增加某些魔法,让用户动态的选中它们想要放进同一个框架窗口内的视图,使用EkSwitchViewInFrame()公用函数,切换视图只是一个函数调用的问题。

第1步:实现EkSwitchViewInFrame()函数,该函数通过 动态的 创建 所需要的 视图类型 而 替换 框架窗口内 的 当前视图。

  1. void EkSwitchViewInFrame(CFrameWnd* pFrame,CRuntimeClass* pViewClass)  
  2. {  
  3.       ASSERT_VALID(pFrame);  
  4.       ASSERT(pViewClass!=NULL);  
  5.       ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView)));  
  6.       //1、查找当前的活动视图   
  7.       CView *pActiveView=pFrame->GetActiveView();  
  8.       if(pActiveView == NULL)  
  9.       {  
  10.             TRACE0("Unable to switch:no active view/n");  
  11.             return ;  
  12.       }  
  13.       if(pActiveView->IsKindOf(pViewClass))  
  14.       {  
  15.             //对同一个视图类不需切换   
  16.             return;  
  17.       }  
  18.       //2、保存当前视图的位置大小   
  19.       CRect rcView;  
  20.       pActiveView->GetWindowRect(&rcView);  
  21.       //3、查找关联的文档   
  22.       CDocument* pDoc=pActiveView->GetDocument();  
  23.       ASSERT_VALID(pDoc);  
  24.       //4、当释放活动视图时,确保文档不会自我析构   
  25.       BOOL bSaveAutoDelete = pDoc->m_bAutoDelete;  
  26.       pDoc->m_bAutoDelete=false;  
  27.       //5、释放活动视图   
  28.       pActiveView->DestroyWindow();  
  29.       //6、恢复文档到初始状态   
  30.       pDoc->m_bAutoDelete=bSaveAutoDelete ;  
  31.       //7、初始化CreateView()使用的创建上下文  
  32.       CCreateContext context;  
  33.       context.m_pNewDocTemplate=NULL;  
  34.       context.m_pLastView=NULL;  
  35.       context.m_pCurrentFrame=NULL;  
  36.       context.m_pNewViewClass=pViewClass;  
  37.       context.m_pCurrentDoc=pDoc;  
  38.       //8、创建新的视图   
  39.       CView* pNewView=static_cast<CView*>(pFrame->CreateView(&context));  
  40.       ASSERT(pNewView);  
  41.       //9、定位新视图,与旧视图位置相同   
  42.       pFrame->ScreenToClient(&rcView);  
  43.       pNewView->MoveWindow(&rcView,true);  
  44.       //10、给视图发送WM_INITIALUPDATE消息   
  45.       pFrame->InitialUpdateFrame(pDoc,true);  
  46. }  
 

第2步:当打算在某个特定的框架窗口内切换一个新视图时,调用EkSwitchViewInFrame()函数。

[c-sharp] view plain copy print ?
  1. #include "DrawView.h"  
  2. #include "DrawFormView.h"   
  3. void CDrawDoc::OnSwitchDrawView()   
  4. {  
  5.     CFrameWnd* pActiveFrame = EkGetActiveFrame();  
  6.     if( pActiveFrame )  
  7.     {  
  8.         EkSwitchViewInFrame(pActiveFrame,RUNTIME_CLASS( CDrawView ) );  
  9.     }  
  10. }  
  11. void CDrawDoc::OnSwitchFormView()   
  12. {  
  13.     CFrameWnd* pActiveFrame = EkGetActiveFrame();  
  14.     if( pActiveFrame )  
  15.     {  
  16.         EkSwitchViewInFrame(pActiveFrame,RUNTIME_CLASS( CDrawFormView ) );  
  17.     }  
  18. }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值