⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 carnaviview.cpp

📁 手持PDA汽车导航程序源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// CarNaviView.cpp : implementation of the CCarNaviView class
//

#include "stdafx.h"
#include "CarNavi.h"

#include "CarNaviDoc.h"
#include "CarNaviView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

const long USER_ACTION_NONE = 0;
const long USER_ACTION_SELECT_PATH_FROM_POINT = 100;
const long USER_ACTION_SELECT_PATH_TO_POINT = 101;

const long TIMER_SIMULATION = 900;
const long TIMER_REAL = 901;
/////////////////////////////////////////////////////////////////////////////
// CCarNaviView

IMPLEMENT_DYNCREATE(CCarNaviView, CView)

BEGIN_MESSAGE_MAP(CCarNaviView, CView)
	//{{AFX_MSG_MAP(CCarNaviView)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
	ON_COMMAND(ID_MAP_PAN, OnMapPan)
	ON_COMMAND(ID_MAP_REFRESH, OnMapRefresh)
	ON_COMMAND(ID_MAP_VIEWENTIRE, OnMapViewentire)
	ON_COMMAND(ID_MAP_ZOOMIN, OnMapZoomin)
	ON_COMMAND(ID_MAP_ZOOMOUT, OnMapZoomout)
	ON_COMMAND(ID_NAVI_REAL, OnNaviReal)
	ON_COMMAND(ID_NAVI_SIMULATE, OnNaviSimulate)
	ON_COMMAND(ID_PATH_FAST, OnPathFast)
	ON_COMMAND(ID_PATH_FROM, OnPathFrom)
	ON_COMMAND(ID_PATH_SHORTEST, OnPathShortest)
	ON_COMMAND(ID_PATH_TO, OnPathTo)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_TIMER()
	ON_COMMAND(ID_GPS_OPEN, OnGpsOpen)
	ON_COMMAND(ID_GPS_CLOSE, OnGpsClose)
	ON_COMMAND(ID_GPS_SHOW_DATA, OnGpsShowData)
	ON_COMMAND(ID_GPS_SHOW_ON_MAP, OnGpsShowOnMap)
	ON_COMMAND(ID_GPS_SHOW_SAT_STATUS, OnGpsShowSatStatus)
	ON_UPDATE_COMMAND_UI(ID_GPS_SHOW_ON_MAP, OnUpdateGpsShowOnMap)
	ON_UPDATE_COMMAND_UI(ID_NAVI_REAL, OnUpdateNaviReal)
	ON_UPDATE_COMMAND_UI(ID_NAVI_SIMULATE, OnUpdateNaviSimulate)
	ON_COMMAND(ID_PATH_REMOVE, OnPathRemove)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCarNaviView construction/destruction

CCarNaviView::CCarNaviView()
{
	//初始化
	m_bFileOpened = false;

	m_bGPSOpened = false;

	m_bShowGPSonMap = false;

	//路径出发地、目的地是否显示
	m_bShowPathFromnToPoint = false;

	m_bNaviReal = false;		//真实导航
	m_bNaviSimulate = false;	//模拟导航
}

CCarNaviView::~CCarNaviView()
{
}

BOOL CCarNaviView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CCarNaviView drawing

void CCarNaviView::OnDraw(CDC* pDC)
{
	CCarNaviDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
	//{{显示地图
	CRect  rcClient;
	GetClientRect( &rcClient );

	if( m_bFileOpened )
	{
		m_MapWnd.OnDraw( pDC, rcClient, rcClient );
	}
	else
	{
		pDC->FillSolidRect( &rcClient, RGB(255,255,255) );
	}
	//}}显示地图

	//{{显示GPS点
	if( m_bShowGPSonMap )
	{
		DrawGPSonMap( pDC );
	}
	//}}显示GPS点

	//{{显示路径的出发地和目的地
	if( m_bShowPathFromnToPoint )
	{
		DrawPathFromnToPoint( pDC );
	}
	//}}显示路径的出发地和目的地
}

/////////////////////////////////////////////////////////////////////////////
// CCarNaviView diagnostics

#ifdef _DEBUG
void CCarNaviView::AssertValid() const
{
	CView::AssertValid();
}

void CCarNaviView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CCarNaviDoc* CCarNaviView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCarNaviDoc)));
	return (CCarNaviDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CCarNaviView message handlers

void CCarNaviView::OnFileOpen() 
{

	CFileDialog dlgFile( true, _T(""), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("WorkSpace Files (*.pmw)|*.pmw") );

	//弹出对话框选择工作空间文件
	if( dlgFile.DoModal() == IDOK )
	{
		//如果已经打开工作空间文件,则先关闭
		if( theApp.m_WorkSpace.IsOpen() )
		{	 	
			theApp.m_WorkSpace.Close();
			m_MapWnd.Close();
			m_bFileOpened = false;
		}
		
		//获得图形文件的完整路径及文件名
		CString strFileName = dlgFile.GetPathName();

		//打开工作空间
		if( theApp.m_WorkSpace.Open( strFileName ) )
		{	
			//与地图窗口关联
			m_MapWnd.OnInitialUpdate( &theApp.m_WorkSpace, this );

			//获取地图列表
			CSeMaps *pMaps = theApp.m_WorkSpace.GetMaps();
			if( pMaps )
			{
				if( pMaps->GetMapCount() > 0 ) 
				{//如果有定义好的地图就打开第一个地图
					CSeMapDef MapDef;
					
					//打开地图方法一: 通过名字取地图
					CString strMapName = pMaps->GetMapNameAt(0);
					
					if( pMaps->GetMap( strMapName, MapDef ) )
					{
						if( m_MapWnd.OpenMap( MapDef ) )
						{
							m_MapWnd.Refresh();
						}
					}
				}
				else
				{//没有地图,打开第一个数据源的第一个数据集作为当前地图
					CSeDataSource *pDataSource = theApp.m_WorkSpace.GetDataSourceAt( 0 );
					if( pDataSource && pDataSource->GetDatasetCount() > 0 )
					{
						//取第一个数据集添加到地图窗口中
						CSeDataset *pDataset = pDataSource->GetDatasetAt( 0 );
						if( pDataset )
						{
							m_MapWnd.AddLayer( pDataset );
							m_MapWnd.Refresh();						
						}
					}		
				}
			}
			m_bFileOpened = true;	
		}
	}
}

void CCarNaviView::OnFileClose() 
{
	theApp.m_WorkSpace.Close();
	m_MapWnd.Close();
	m_bFileOpened = false;
	m_MapWnd.Refresh();
}

void CCarNaviView::OnMapPan() 
{
	//平移地图
	m_MapWnd.SetAction( CSeDrawParameters::uaPan );	
}

void CCarNaviView::OnMapRefresh() 
{
	//刷新
	m_MapWnd.Refresh();
}

void CCarNaviView::OnMapViewentire() 
{
	//整幅显示
	m_MapWnd.ViewEntire();
}

void CCarNaviView::OnMapZoomin() 
{
	//放大
	m_MapWnd.SetAction( CSeDrawParameters::uaZoomIn );
}

void CCarNaviView::OnMapZoomout() 
{
	//缩小
	m_MapWnd.SetAction( CSeDrawParameters::uaZoomOut );
}

void CCarNaviView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	//响应鼠标操作
	m_MapWnd.OnLButtonDown(nFlags, point);
	
	CView::OnLButtonDown(nFlags, point);
}

void CCarNaviView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	//响应鼠标操作
	m_MapWnd.OnLButtonUp(nFlags, point);

	//{{路径分析
	if( m_MapWnd.GetAction() == USER_ACTION_SELECT_PATH_FROM_POINT )
	{
		//选择出发地
		m_pntFrom = point;
		m_MapWnd.GetDrawParam()->ClientToMap( &m_pntFrom, 1 );

		//刷新显示出发地、目的地
		m_bShowPathFromnToPoint = true;
		m_MapWnd.Refresh();
	}
	else if( m_MapWnd.GetAction() == USER_ACTION_SELECT_PATH_TO_POINT )
	{
		//选择目的地
		m_pntTo = point;
		m_MapWnd.GetDrawParam()->ClientToMap( &m_pntTo, 1 );

		//刷新显示出发地、目的地
		m_bShowPathFromnToPoint = true;
		m_MapWnd.Refresh();
	}
	//}}路径分析

	
	CView::OnLButtonUp(nFlags, point);
}

//===================================================================================

//{{路径分析
void CCarNaviView::OnPathFrom() 
{
	//设置用户动作为 选择 出发地
	m_MapWnd.SetAction( (CSeDrawParameters::Action) USER_ACTION_SELECT_PATH_FROM_POINT );
}

void CCarNaviView::OnPathTo() 
{
	//设置用户动作为 选择 目的地
	m_MapWnd.SetAction( (CSeDrawParameters::Action) USER_ACTION_SELECT_PATH_TO_POINT );
}

void CCarNaviView::OnPathShortest() 
{
	//初始化路径分析对象 -- 最短路径分析
	PathAnalyseInit( 0 );

	//最短路径分析
	PathAnalysing();
}

void CCarNaviView::OnPathFast() 
{
	//初始化路径分析对象 -- 最快路径分析
	PathAnalyseInit( 1 );

	//最快路径分析
	PathAnalysing();
}

void CCarNaviView::PathAnalyseInit( long nMode ) 
{
	//如果没有初始化m_PathAnalyst对象, 它的网络数据集指针肯定为空
	if( m_PathAnalyst.GetDatasetNetwork() == NULL )
	{
		//获取数据源指针
		CSeDataSource *pDataSource = theApp.m_WorkSpace.GetDataSourceAt( 0 );
		if( pDataSource )
		{
			//获取数据集数
			long nCount = pDataSource->GetDatasetCount();
			CSeDataset *pDataset = NULL;
			for( long i=0;i <nCount; i++ )
			{
				//获取数据集指针
				pDataset = pDataSource->GetDatasetAt( i );
				if( pDataset )
				{
					//如果是网络数据集,则用它来初始化导航对象
					if( pDataset->GetType() == CSeDatasetInfo::Network )
					{
						m_PathAnalyst.SetDatasetNetwork( (CSeDatasetVector *)pDataset );
						m_PathAnalyst.Init();
					}
				}
			}
		}
	}

	//分析模式
	m_PathAnalyst.SetAnalyseMode( nMode );
}

bool CCarNaviView::PathAnalysing() 
{
	CSeDatasetVector *pDatasetV = m_PathAnalyst.GetDatasetNetwork();
	if( pDatasetV )
	{
		CPoint pntFrom;	//出发地坐标点
		CPoint pntTo;	//目的地坐标点

		//找出出发地节点ID
		long nFromNodeID = pDatasetV->FindNearestNode( m_pntFrom, pntFrom );

		//找出目的地节点ID
		long nToNodeID = pDatasetV->FindNearestNode( m_pntTo, pntTo );

		//把以前的结果先清空
		m_arrArcIDs.RemoveAll();
		m_arrNodeIDs.RemoveAll();

		//清空跟踪层的对象
		m_MapWnd.m_TrackingLayer.ReleaseAll();

		//进行分析
		long nLineCount = m_PathAnalyst.Analyse( nFromNodeID, nToNodeID, m_arrArcIDs, m_dPathTotalLength, m_arrNodeIDs );
		if( nLineCount > 0 )
		{
			//根据分析返回的路段ID查出记录集
			CSeRecordset *pRcordset = pDatasetV->QueryByIDs( (long *)m_arrArcIDs.GetData(), m_arrArcIDs.GetSize() );
			if( pRcordset )
			{
				//遍历记录集
				if( pRcordset->MoveFirst() )
				{
					CSeGeometry *pLine = NULL;
					while( !pRcordset->IsEOF() )
					{
						if( pRcordset->GetGeometry( pLine ) )
						{
							if( pLine )
							{
								//把取出来的几何对象添加到跟踪层
								m_MapWnd.m_TrackingLayer.AddEvent( pLine, _T("") );
							}
						}

						pRcordset->MoveNext();
					}

					//{{设置跟踪层的风格
					CSeStyleLine *pStyle = new CSeStyleLine;
					pStyle->m_dwPenStyle = 0;
					pStyle->m_nPenColor = RGB( 255, 0 , 255 );
					pStyle->m_nPenWidth = 5;
					m_MapWnd.m_TrackingLayer.SetStyle( pStyle ); 
					m_MapWnd.m_TrackingLayer.SetFixedStyle( true );
					m_MapWnd.Refresh();

					//}}设置跟踪层的风格
				}

				//释放记录集指针
				pDatasetV->ReleaseRecordset( pRcordset );
			}
			return true;
		}
	}
	return false;
}

//删除分析出来的路径, 隐藏出发地和目的地的
void CCarNaviView::OnPathRemove() 
{
	//把以前的结果先清空
	m_arrArcIDs.RemoveAll();
	m_arrNodeIDs.RemoveAll();

	//清空跟踪层的对象
	m_MapWnd.m_TrackingLayer.ReleaseAll();
	m_bShowPathFromnToPoint = false;

	m_strNaviInfo = _T("");

	m_MapWnd.Refresh();
}

void CCarNaviView::DrawPathFromnToPoint( CDC *pDC )
{
	//简单绘制一个"紫方块"来表示出发地
	CPoint pntDraw( m_pntFrom );
	m_MapWnd.GetDrawParam()->MapToClient( &pntDraw, 1 );
	pDC->FillSolidRect( pntDraw.x-5, pntDraw.y-5, 10, 10, RGB(255,0,255) );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -