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

📄 maptestview.cpp

📁 gps 可以打开.gps
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MapTestView.cpp : implementation of the CMapTestView class
//

#include "stdafx.h"
#include "MapTest.h"

#include "MapTestDoc.h"
#include "MapTestView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
CMapLayer *pMapLaer;

#endif


/////////////////////////////////////////////////////////////////////////////
// CMapTestView

IMPLEMENT_DYNCREATE(CMapTestView, CView)

BEGIN_MESSAGE_MAP(CMapTestView, CView)
//{{AFX_MSG_MAP(CMapTestView)
ON_COMMAND(ID_OpenMif, OnOpenMif)
ON_COMMAND_RANGE(ID_ZoomIn,ID_Pan,OnMapControl)
ON_WM_LBUTTONDOWN()
ON_WM_SIZE()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_UPDATE_COMMAND_UI_RANGE(ID_ZoomIn,ID_Pan, OnUpdateMapControl)
ON_COMMAND(ID_ConvFile, OnConvFile)
ON_COMMAND(ID_OpenData, OnOpenData)
	ON_COMMAND(ID_FindPath, OnFindPath)
	ON_UPDATE_COMMAND_UI(ID_FindPath, OnUpdateFindPath)
ON_WM_CANCELMODE()
	ON_COMMAND(ID_MapClose, OnMapClose)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMapTestView construction/destruction

CMapTestView::CMapTestView()
{
	// TODO: add construction code here
	m_nMouseMode = ID_ARROW;//鼠标的当前任务
	m_bMapMoving=false;
	
}

CMapTestView::~CMapTestView()
{
}

BOOL CMapTestView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	//获得自定义光标资源
	m_hcurHand = (HCURSOR)::LoadImage(cs.hInstance,
		MAKEINTRESOURCE(IDC_CURSOR_Pan), IMAGE_CURSOR, 32, 32, LR_DEFAULTCOLOR);
	
	m_hcurZoomIn = (HCURSOR)::LoadImage(cs.hInstance,
		MAKEINTRESOURCE(IDC_CURSOR_ZoomIn), IMAGE_CURSOR, 32, 32, LR_DEFAULTCOLOR);
	
	m_hcurZoomOut = (HCURSOR)::LoadImage(cs.hInstance,
		MAKEINTRESOURCE(IDC_CURSOR_ZoomOut), IMAGE_CURSOR, 32, 32, LR_DEFAULTCOLOR);
	
	m_hcurCross = (HCURSOR)::LoadImage(cs.hInstance,
		MAKEINTRESOURCE(IDC_CURSOR_Cross), IMAGE_CURSOR, 32, 32, LR_DEFAULTCOLOR);
	
	
	//获得光标资源的另一种方法
	m_hcurArrow = AfxGetApp()->LoadCursor(IDC_CURSOR_ARROW);
    ///***///
	//	m_hcurMoving = AfxGetApp()->LoadCursor(IDC_CURSOR_MOVE);
	
	
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMapTestView drawing

void CMapTestView::OnDraw(CDC* pDC)
{
	CMapTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	////////////////////
	//pDoc->DrawObjects(pDC);
	////////////////////
	
	CDC* dc = GetDC();
	dc->BitBlt(0, 0, pDoc->m_nViewWidth, pDoc->m_nVeiwHeight, pDoc->m_pMemDC,
		0, 0,SRCCOPY);//
	ReleaseDC(dc);
}

/////////////////////////////////////////////////////////////////////////////
// CMapTestView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CMapTestView message handlers

void CMapTestView::OnOpenMif() 
{
	// TODO: Add your command handler code here
	No=0;
	CDC* pDC = GetDC();//申请DC
    CString strLayerPath,strLayerName,strMidPath;
  
    CMapTestDoc* pDoc = GetDocument(); 
	
	char filterstr[]="MapInfo 文件(*.mif)|*.mif||";
	CFileDialog dlg(true,"mif",NULL,OFN_HIDEREADONLY,filterstr,this);
	dlg.m_ofn.Flags |= OFN_ALLOWMULTISELECT;//允许多选
	
	if(dlg.DoModal()==IDCANCEL) return;
	
	
	POSITION pos = dlg.GetStartPosition(); //返回选择对象列表信息

	pDoc->mif_gps=true;  //确定打开的是MIF文件

	while(pos)
	{
		strLayerPath = dlg.GetNextPathName(pos);//文件全路径
		path[No++]=strLayerPath;                //将文件全路径传递给路径数据
		
		//获取图层文件名长度
		int len=strLayerPath.GetLength();

        //设置对应的MID文件的路径
		strMidPath=strLayerPath;
		strMidPath.SetAt(len-1,'D');
		
		//获取图层文件名
		for(;strLayerPath.GetAt(len-1) != '\\';len--);   //see the return value descripation for GetHead		
		strLayerName = strLayerPath.Mid(len,strLayerPath.GetLength()); //Mid返回 variant(string) 其中包含字符串中指定数量的字符 
        //读取对应的MID文件
		CFileFind findFile;
		if(!findFile.FindFile(strMidPath))
		{
			AfxMessageBox("没有找到"+ strLayerName +"对应的MID文件");
		}
		else
		{   //读取MID文件中的内容
			CFile midFile(strMidPath,CFile::modeRead); //CFile 文件操作类 CFile  <对象名>(文件名,方式)
			CArchive br(&midFile, CArchive::load); //CArchive使用缓冲区作为临时数据存储地,读写都先依次排列到此缓冲区,当缓冲区满或用户要求时,将此段整理后的数据读写到指定的存储介质。 好比火车货场装运零散的货物被收集,当总量到达火车运量的时候,由火车装运走。

			CString str;
			int i=0;
			while(br.ReadString(str))
			{

				pDoc->Nam[i]= str;     //读取MID中的属性信息
				i++;                   //注意:此处会发生数组溢出,程序错误终止		
			}
		    br.Close();
		    midFile.Close();
		}
		
		//读取MIF文件中的全部内容
		CFile layerFile(strLayerPath,CFile::modeRead); //CFile 文件操作类 CFile  <对象名>(文件名,方式)
		CArchive ar(&layerFile, CArchive::load); //CArchive使用缓冲区作为临时数据存储地,读写都先依次排列到此缓冲区,当缓冲区满或用户要求时,将此段整理后的数据读写到指定的存储介质。 好比火车货场装运零散的货物被收集,当总量到达火车运量的时候,由火车装运走。
		
		pMapLaer = new CMapLayer(pDoc, ar);		
//		pMapLaer->m_strLayerName = strLayerName;// 获得图层名

		pDoc->m_aLayers.Add(pMapLaer);          //添加图层
		pDoc->m_nMaxPoint = pDoc->m_nMaxPoint > pMapLaer->m_nMaxPoint ? pDoc->m_nMaxPoint : pMapLaer->m_nMaxPoint;		
		///////////////////////////////////////

				pDoc->m_fMapjw[0] =  pDoc->m_fMinX ;		
				pDoc->m_fMapjw[1] =  pDoc->m_fMaxX ;		
				pDoc->m_fMapjw[2] =  pDoc->m_fMaxY ; //上		
				pDoc->m_fMapjw[3] =  pDoc->m_fMinY ;//下
	       
			double dx,dy;
               dx=pDoc->m_fMaxX-pDoc->m_fMinX ;
			   dy=pDoc->m_fMaxY-pDoc->m_fMinY;
  		pDoc->SetMapReach(dx,dy);   //设置地图显示区域的大小,dx dy为地图的实际大小

		ar.Close();
		layerFile.Close();
	}
	pDoc->m_pData = new long[pDoc->m_nMaxPoint*2];//申请计算用临时内存
	pDoc->DrawMap(pDoc->m_pMemDC);//在位图上绘制地图

	ReleaseDC(pDC);
	Invalidate();
}



void CMapTestView::OnLButtonDown(UINT nFlags, CPoint point) 
{

	// TODO: Add your message handler code here and/or call default
	double jing, wei;
	CMapTestDoc* pDoc = GetDocument();
	
//	if( !pDoc->m_aLayers.GetSize() )
//	{//未打开地图
//		MessageBox("未打开图");
//		return;
//	}
	
	CRect client;
	GetClientRect(&client);//获得客户区范围
	ClientToScreen(&client);//转化为屏幕坐标
	//	::ClipCursor(&client);//锁定鼠标移动范围
	
	switch(m_nMouseMode)
	{
	case ID_ZoomOut://缩小
		pDoc->DPtoLP(point.x, point.y);  //屏幕坐标转换为地图逻辑坐标
		pDoc->ConvToJW(point.x, point.y, jing, wei);//计算鼠标点经纬度
		pDoc->Zoom(0.8);//缩小地图
		pDoc->ConvToXY(jing, wei, point.x, point.y);//计算缩小后的逻辑坐标
		pDoc->SetCenter(point); //
		pDoc->DrawMap(pDoc->m_pMemDC);//重绘地图
		Invalidate(false);//更新显示
		//          MessageBox("//缩小");
		break; 
	case ID_ZoomIn://放大
		pDoc->DPtoLP(point.x, point.y); //屏幕坐标转换为地图逻辑坐标
		pDoc->ConvToJW(point.x, point.y, jing, wei);//计算鼠标点经纬度
		pDoc->Zoom(1.2);//放大地图
		pDoc->ConvToXY(jing, wei, point.x, point.y);//计算放大后的逻辑坐标
		pDoc->SetCenter(point);//设置地图显示的中心
		pDoc->DrawMap(pDoc->m_pMemDC);//重绘地图
		Invalidate(false);//更新显示
		
		break;
	case ID_Pan://漫游
		m_ptOldPoint = point;//漫游起点坐标
		m_bMapMoving = true;
		break;
		//////////////////////////////////////////////////////////
	case ID_ARROW:

		break;
	case ID_FindPath:
		 pMapLaer->PathSearch(point);
         Invalidate();

		break;
		
	}
	CView::OnLButtonDown(nFlags, point);
}

void CMapTestView::OnMapControl(UINT nID) 
{
	// TODO: Add your command handler code here
	m_nMouseMode=nID;
	switch (nID)
	{
	case ID_ARROW:
		::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (LONG)m_hcurArrow);
		//	m_nMouseMode=ID_ARROW;
		break;
	case ID_ZoomIn:
		::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (LONG)m_hcurZoomIn);
		//	m_nMouseMode=ID_ZoomIn;
		break;
	case ID_ZoomOut:
		::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (LONG)m_hcurZoomOut);
		//  m_nMouseMode=ID_ZoomOut;
		break;
	case ID_Pan:
		::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (LONG)m_hcurHand);
        break;
	}
	
}

void CMapTestView::OnUpdateMapControl(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(pCmdUI->m_nID == m_nMouseMode);
}


void CMapTestView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	CDC* pDC = GetDC();
	CMapTestDoc* pDoc = GetDocument();

	pDoc->m_nViewWidth = cx;
	pDoc->m_nVeiwHeight = cy;
	
	if(pDoc->m_pMemDC)//
	{
		CDC dc;
		dc.CreateCompatibleDC(pDC);//创建兼容DC
		CBitmap *bitmap = new CBitmap;//重新创建BITMAP资源
		bitmap->CreateCompatibleBitmap(pDC, cx, cy);
		CBitmap* map = dc.SelectObject(bitmap);
		dc.BitBlt(0, 0, cx, cy, NULL, 0, 0, WHITENESS);//清空BITMAP
		dc.BitBlt(0, 0, cx, cy, pDoc->m_pMemDC, 0, 0, SRCCOPY);//复制
		dc.SelectObject(map);//恢复DC
		dc.DeleteDC();//删除DC
		pDoc->m_pMemDC->SelectObject(bitmap);//选出原BITMAP
		pDoc->m_pBitmap->DeleteObject();//删除BITMAP资源
		delete pDoc->m_pBitmap;//删除BITMAP对象
		pDoc->m_pBitmap = bitmap;

		if(pDoc->m_nViewWidth<cx || pDoc->m_nVeiwHeight<cy)
		{
			pDoc->m_nViewWidth = cx;
			pDoc->m_nVeiwHeight = cy;
			//重绘位图
			pDoc->DrawMap(pDoc->m_pMemDC);
        	Invalidate();
		}
		pDoc->m_nViewWidth = cx;
		pDoc->m_nVeiwHeight = cy;
	}
	else
	{
		pDoc->m_pMemDC = new CDC;
		pDoc->m_pMemDC->CreateCompatibleDC(pDC);//创建CD
		pDoc->m_pBitmap = new CBitmap;
		pDoc->m_pBitmap->CreateCompatibleBitmap(pDC, cx, cy);//创建BITMAP

⌨️ 快捷键说明

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