具体实现方法如下:
(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 数据显示界面
结论 通过这种方法实现视图切换,提高了系统开销,特别是针对许多视图情况更加明显。