📄 maptestview.cpp
字号:
// 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 + -