VC视图切换技术(视图不销毁)(转)

在开发一个无人机地面站系统中由于要监测的东西比较多,所以就打算采用切换视图技术,将要监测的数据放在不同的视类里显示,在用VC进行视图切换时,一般的做法好像都是在切换时首先要销毁当前视图,然后再新创建下一个视图,这样做开销比较大,特别是对于我开发的这个系统,因为里面是MAPINFO格式地图文件,创建比较费时,所以,我就没有用这种方法,而是使用隐藏机制,即先将视类全创建好,然后在需要显示哪个视类的时候,就调用哪个视类,而将其他的视类隐藏起来,这样就大大提高了系统的效率。

具体实现方法如下:

(1)首先在CMainFrame里的OnCreateClient函数里添加视类,在该主框架类里实现几个视类共存。

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
 // TODO: Add your specialized code here and/or call the base class
 int f_iFirstView;
 int f_iSecondView;
 f_iFirstView = AddView(pContext);
 if(f_iFirstView < 0)
  return FALSE;
 //*/
 //在此处添加地图显示视图
 pContext->m_pNewViewClass = RUNTIME_CLASS(CMapView);
 f_iSecondView = AddView(pContext);

//SetTopView函数显示视图的切换功能,设置当前显示视类
 SetTopView(f_iSecondView);
// m_iTopView=0;
 return TRUE;
}

AddView是子定义函数,实现添加视类的功能,具体实现如下:

int CMainFrame::AddView(CCreateContext *pContext)
{
 CView* f_pView = NULL;

 //最多支持255个视类对象,m_arViewPointer是数组,保存添加的视类个数
 if(m_arViewPointer.GetSize() >= 255)
  return -1;
 
 //检查入口参数有效性
 if (pContext != NULL && pContext->m_pNewViewClass != NULL)
 {
  //创建默认视
  f_pView = (CView*)CreateView(pContext, 
   AFX_IDW_PANE_LAST - m_arViewPointer.GetSize());
  if (f_pView == NULL)
   return FALSE;
  
  //隐藏新创建视
  f_pView->ShowWindow(SW_HIDE);
  //将视类指针加入队列
  return m_arViewPointer.Add(f_pView);
 }
 else
 {
  return -1;
 }
}

void CMainFrame::SetTopView(int iTopView)
{
 if((iTopView < 0)||(iTopView >= m_arViewPointer.GetSize()))
  return;

 CView* f_pOldTop = (CView*)m_arViewPointer[m_iTopView];
 CView* f_pNewTop = (CView*)m_arViewPointer[iTopView];

 //隐藏旧视图
 ::SetWindowLong(f_pOldTop->m_hWnd, GWL_ID, (AFX_IDW_PANE_LAST-m_iTopView));
 f_pOldTop->ShowWindow(SW_HIDE);

 //显示新视图
 m_iTopView = iTopView;
 ::SetWindowLong(f_pNewTop->GetSafeHwnd(), GWL_ID, (AFX_IDW_PANE_FIRST));
 f_pNewTop->ShowWindow(SW_SHOW);

 //刷新
 RecalcLayout();
}

这样在你想要显示哪个视类时,只要调用SetTopView(int iTopView)就行了,效果如下图:

                                                                                      图1 航迹显示界面

    图2 数据显示界面

结论 通过这种方法实现视图切换,提高了系统开销,特别是针对许多视图情况更加明显。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值