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

📄 playbackview.cpp

📁 GPS导航的源代码
💻 CPP
字号:
// PlaybackView.cpp : implementation of the CPlaybackView class
//

#include "stdafx.h"
#include "Playback.h"

#include "PlaybackDoc.h"
#include "PlaybackView.h"
#include "MapTypes.h"

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

/////////////////////////////////////////////////////////////////////////////
// CPlaybackView
int h,m,s,ms;
double longitude,latitude,speed,direct;
HANDLE hDataFileReadThread=NULL;
HWND g_hMessageWnd=NULL;
int nStop=0;

IMPLEMENT_DYNCREATE(CPlaybackView, CView)

BEGIN_MESSAGE_MAP(CPlaybackView, CView)
	//{{AFX_MSG_MAP(CPlaybackView)
	ON_WM_CREATE()
	ON_COMMAND(ID_MAP_OPEN, OnMapOpen)
	ON_WM_SIZE()
	ON_COMMAND(ID_MAP_PLAYBACK, OnMapPlayback)
	ON_MESSAGE(WM_VERTEX,OnVertex)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPlaybackView construction/destruction

CPlaybackView::CPlaybackView()
{
	// TODO: add construction code here
}

CPlaybackView::~CPlaybackView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CPlaybackView drawing

void CPlaybackView::OnDraw(CDC* pDC)
{
	CPlaybackDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CPlaybackView printing

BOOL CPlaybackView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CPlaybackView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CPlaybackView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CPlaybackView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CPlaybackView message handlers

int CPlaybackView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	RECT rc;
	GetClientRect(&rc);
	if(m_mapx.Create(_T(""),WS_VISIBLE,rc,this,ID_MAP))
	{
	}

	return 0;
}

void CPlaybackView::OnMapOpen() 
{
	// TODO: Add your command handler code here
	CFileDialog dlg(TRUE,_T(".gst"),NULL,OFN_HIDEREADONLY,_T("地图文件(*.gst)|*.gst||"));

	if(dlg.DoModal() == IDOK)
	{
		if(IsWindow(m_mapx.m_hWnd))
		{
			try
			{
				m_mapx.SetGeoSet(dlg.GetPathName());
			}
			catch(COleDispatchException *e)
			{
				e->Delete();
			}

			m_mapx.SetTitleText(_T(""));

			//设置地图单位为公里
			m_mapx.SetMapUnit(miUnitKilometer);
			m_mapx.SetPaperUnit(miPaperUnitCentimeter);

			CreateWorkLayer();
		}
	}
}

void CPlaybackView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	if(IsWindow(m_mapx.m_hWnd))
		m_mapx.MoveWindow(0,0,cx,cy);
}

BOOL CPlaybackView::CreateWorkLayer()
{
	char *czLayerName=_T("Road");

	char strFilename[MAX_PATH];
	GetFilePath(strFilename,MAX_PATH,czLayerName);
	strcat(strFilename,".tab");

	try
	{
		Lyr = m_mapx.GetLayers().Add(strFilename);
	}
	catch(COleDispatchException *e)
	{
		Lyr = NULL;
		e->Delete();
	}

	if(Lyr == NULL)
	{
		try
		{
			Lyr = m_mapx.GetLayers().CreateLayer(strFilename,strFilename);//COptionalVariant(),COleVariant(1L),COptionalVariant(),COptionalVariant());
		}
		catch(COleDispatchException *e)
		{
			Lyr = NULL;
			e->Delete();
		}
	}

	return TRUE;
}

BOOL CPlaybackView::GetFilePath(char *FilePath,int len,const char *FileName)
{
	memset(FilePath,0,len);
	GetModuleFileName(NULL,FilePath,len);
	char *p=strrchr(FilePath,'\\');
	if(p != NULL)
		strncpy(p+1,FileName,len-(p-FilePath)-1);
	else
		_snprintf(FilePath,len,"\\%s",FileName);

	return TRUE;
}

char *GetToken(char *buf)
{
	char *p=buf;
	while(*p != '\0' && *p != ' ' && *p != '\t')
		p++;
	*p=0;
	return buf;
}

DWORD WINAPI DatafileReaderProc(LPVOID lpParam)
{
	FILE *fp=(FILE *)lpParam;
	char line[512];
	
	//开始播放
	while(!feof(fp) && !nStop)
	{
		fgets(line,512,fp);
		/*hh:mm:ss:ms longitude latitude speed power XX err XX snr XX ber XX msl mdl*/
		char *fld;
		
		//时间
		fld=GetToken(line);
		sscanf(line,"%d:%d:%d:%d",&h,&m,&s,&ms);
		
		//经度
		fld=fld+strlen(fld)+1;
		fld=GetToken(fld);
		longitude=atof(fld);

		//纬度
		fld=fld+strlen(fld)+1;
		fld=GetToken(fld);
		latitude=atof(fld);

		//速度
		fld=fld+strlen(fld)+1;
		fld=GetToken(fld);
		speed=atof(fld);

		//方向
		fld=fld+strlen(fld)+1;
		fld=GetToken(fld);
		direct=atof(fld);

		if(g_hMessageWnd != NULL)
			::SendMessage(g_hMessageWnd,WM_VERTEX,0,1);

		SleepEx(1000,TRUE);
	}
	
	//播放结束
	if(g_hMessageWnd != NULL)
		SendMessage(g_hMessageWnd,WM_VERTEX,0,0);

	fclose(fp);

	return 0;
}

void PlaybackDatafile(char *strFile)
{
	FILE *fp=fopen(strFile,"r");
	if(fp != NULL)
	{
		nStop=0;
		hDataFileReadThread=CreateThread(NULL,0,DatafileReaderProc,(LPVOID)fp,0,NULL);
	}
}

void StopPlayback()
{
	nStop=1;
	if(hDataFileReadThread != NULL)
	{
		WaitForSingleObject(hDataFileReadThread,100);
		hDataFileReadThread=NULL;
	}
}

void CPlaybackView::OnMapPlayback() 
{
	// TODO: Add your command handler code here
	g_hMessageWnd=m_hWnd;
	if(hDataFileReadThread == NULL)
	{
		CFileDialog dlg(TRUE,_T(".txt"),NULL,OFN_HIDEREADONLY,_T("数据文件(*.txt)|*.txt||"));
		if(dlg.DoModal() == IDOK)
		{
			m_bIsFirstPoint=TRUE;
			AddRoad((char *)(const char *)dlg.GetPathName());
//			PlaybackDatafile((char *)(const char *)dlg.GetPathName());
		}
	}
	else
	{
		StopPlayback();
	}
}

double oldlongitude,oldlatitude;

void CPlaybackView::OnVertex(WPARAM wParam,LPARAM lParam)
{
	if(lParam != 0)
	{
		if(m_bIsFirstPoint)
			m_bIsFirstPoint=FALSE;
		else
		{
			DrawLine(oldlongitude,oldlatitude,longitude,latitude);
		}
		oldlongitude=longitude;
		oldlatitude=latitude;

		if(!m_mapx.IsPointVisible(longitude,latitude))
		{
			m_mapx.SetCenterX(longitude);
			m_mapx.SetCenterY(latitude);
		}
	}
	else
	{
	}
}

void CPlaybackView::DrawLine(double x1, double y1, double x2, double y2)
{
	CMapXPoints pts;
	CMapXFeature newObj,ftrBind;
	CMapXLayer myLayer;
	VARIANT v1;

    //{ Draw line }
	pts.CreateDispatch(pts.GetClsid());
	pts.AddXY(x1,y1,pts.GetCount()+1);
    pts.AddXY(x2,y2,pts.GetCount()+1);
	v1.vt = VT_DISPATCH ;
	v1.pdispVal= pts;
    newObj = m_mapx.GetFeatureFactory().CreateLine(v1, COptionalVariant());

	CMapXStyle style = newObj.GetStyle();
	style.SetLineColor(0xff0000);
	style.SetLineStyle(54);
	style.SetLineWidth(5);

    ftrBind = Lyr.AddFeature(newObj);
}

void CPlaybackView::AddRoad(char *strFile)
{
	CMapXPoints pts;
	CMapXFeature newObj,ftrBind;
	CMapXLayer myLayer;
	VARIANT v1;

	MapFeatureIDStr id;
	MapFeatureProp prop;
	char buf[128*1024];
	MapFeaturePart *part=(MapFeaturePart *)buf;

	memset(&id,0,sizeof(MapFeatureIDStr));
	memset(&prop,0,sizeof(MapFeatureProp));
	memset(part,0,sizeof(MapFeaturePart));

	FILE *fp=fopen(strFile,"r");
	char line[512];

	pts.CreateDispatch(pts.GetClsid());
	//开始播放
	while(!feof(fp) && !nStop)
	{
		fgets(line,512,fp);
		/*hh:mm:ss:ms longitude latitude speed power XX err XX snr XX ber XX msl mdl*/
		char *fld;
		
		//时间
		fld=GetToken(line);
		sscanf(line,"%d:%d:%d:%d",&h,&m,&s,&ms);
		
		//经度
		fld=fld+strlen(fld)+1;
		fld=GetToken(fld);
		longitude=atof(fld);

		//纬度
		fld=fld+strlen(fld)+1;
		fld=GetToken(fld);
		latitude=atof(fld);

		//速度
		fld=fld+strlen(fld)+1;
		fld=GetToken(fld);
		speed=atof(fld);

		//方向
		fld=fld+strlen(fld)+1;
		fld=GetToken(fld);
		direct=atof(fld);

		//{ Draw line }
		if(longitude > 115.0 && longitude < 120.0 &&
		   latitude > 35.0 && latitude < 40.0)
		{
			part->pts[part->npt].x=longitude;
			part->pts[part->npt].y=latitude;
			part->npt++;

			part->bound.pt1.x=part->bound.pt1.x < longitude ? part->bound.pt1.x : longitude;
			part->bound.pt1.y=part->bound.pt1.y < latitude ? part->bound.pt1.y : latitude;
			part->bound.pt2.x=part->bound.pt2.x > longitude ? part->bound.pt2.x : longitude;
			part->bound.pt2.y=part->bound.pt2.y > latitude ? part->bound.pt2.y : latitude;

//			pts.AddXY(longitude,latitude,pts.GetCount()+1);
		}
	}
	
	fclose(fp);

	//
	v1.vt = VT_DISPATCH ;
	v1.pdispVal= pts;
/*
    newObj = m_mapx.GetFeatureFactory().CreateLine(v1, COptionalVariant());

	CMapXStyle style = newObj.GetStyle();
	style.SetLineColor(0xff0000);
	style.SetLineStyle(1);
	style.SetLineWidth(5);

    ftrBind = Lyr.AddFeature(newObj);
*/
	FILE *fpID,*fpMap,*fpProp;
	fpID=fopen("road1.id","a+b");
	fpMap=fopen("road1.map","a+b");
	fpProp=fopen("road1.prop","a+b");

	id.id=0;
	id.offmap=0;
	id.offprop=0;
	sprintf(id.name,"%d",id.id);
	id.type=1;
	id.bound=part->bound;
	fwrite(&id,1,sizeof(MapFeatureIDStr),fpID);

	prop.color=0xff0000;
	prop.width=2;
	fwrite(&prop,1,sizeof(MapFeatureProp),fpProp);

	unsigned long int npt=1,gap=0;
	fwrite(&npt,1,sizeof(unsigned long int),fpMap);
	fwrite(&gap,1,sizeof(unsigned long int),fpMap);
	fwrite(part,1,sizeof(MapFeaturePart)+(part->npt-1)*sizeof(MapPosition),fpMap);

	fclose(fpID);
	fclose(fpMap);
	fclose(fpProp);
}

⌨️ 快捷键说明

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