gpsset.cpp
来自「一个mapxmobile+gps的小程序,需要先安装mapx mobile」· C++ 代码 · 共 307 行
CPP
307 行
// gpsset.cpp
#include "stdafx.h"
#include "gpsset.h"
#include "../HPMapx.h"
const int NZOOM = 2;
CGpsSet::CGpsSet()
{
m_dCX = 0;
m_dCY = 0;
m_nFeaID = 0;
m_dSpeed = 0;
m_dDirection = 0;
}
void CGpsSet::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
if ( cx != 0 && cy != 0 &&
m_ctrlMapX.GetSafeHwnd())
m_ctrlMapX.MoveWindow(0,0,cx,cy,TRUE);
}
void CGpsSet::OnSetFocus(CWnd* pO)
{
CWnd::OnSetFocus(pO);
if(m_ctrlMapX.GetSafeHwnd())
m_ctrlMapX.SetFocus();
}
BOOL CGpsSet::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
TRY
{
if( !m_ctrlMapX.Create(NULL,WS_VISIBLE,CRect(0,0,0,0),this ,IDC_MAP) )
{
MessageBox(_T("应用程序错误,请联系开发单位"),_T("错误"),MB_ICONSTOP|MB_OK);
return false;
}
m_ctrlMapX.SetGeoSet( _T("\\Program Files\\MapInfo\\HPMapx\\Maps\\Qingdao22.gst") );
m_ctrlMapX.GetTitle().SetVisible(FALSE);
OnPan();
OnViewScalebar();
m_ctrlMapX.SetAutoRedraw(TRUE);
m_ctrlMapX.CreateCustomTool(MY_INFOTOOL, miToolTypePoint,miInfoCursor );
m_ctrlMapX.CreateCustomTool(MAP_DISTANCE,miToolTypePoly, miCrossCursor);
m_ctrlMapX.CreateCustomTool(ADD_TARGET, miToolTypePoly, miCrossCursor);
m_ctrlMapX.SetPreferCompactLegends(TRUE);
}
CATCH (COleDispatchException,e)
{
MessageBox(_T("应用程序错误,请联系开发单位"),_T("错误"),MB_ICONSTOP|MB_OK);
return FALSE;
}
AND_CATCH (COleException,e)
{
MessageBox(_T("应用程序错误,请联系开发单位"),_T("错误"),MB_ICONSTOP|MB_OK);
return FALSE;
}
END_CATCH
return TRUE;
}
void CGpsSet::ZoomTo()
{
TRY
{
float sX,sY,scnX,scnY;
double x = m_ctrlMapX.GetCenterX();
double y = m_ctrlMapX.GetCenterY();
double ScreenX = m_ctrlMapX.GetMapScreenWidth() /3;
double ScreenY = m_ctrlMapX.GetMapScreenHeight() /3;
m_ctrlMapX.ConvertCoord(&sX,&sY,&m_dCX,&m_dCY,miMapToScreen);
m_ctrlMapX.ConvertCoord(&scnX,&scnY,&x,&y,miMapToScreen);
if( fabs( sX - scnX ) > ScreenX ||
fabs( sY - scnY ) > ScreenY )
m_ctrlMapX.ZoomTo(m_ctrlMapX.GetZoom() ,m_dCX,m_dCY);
}
CATCH (COleDispatchException,e)
{
}
AND_CATCH (COleException,e)
{
}
END_CATCH
}
#define __D(x) (double)##x
void CGpsSet::UpdateDirection(CMapXFeature &feature)
{
double d=m_dDirection;
CString strFileName;
if( d == __D(0 ) )
return;
TRY
{
// m_ctrlMapX.SetRotation(m_dDirection);
// m_ctrlMapX.SetAutoRedraw(TRUE);
if(d > __D(20) && d < __D( 40) ) strFileName =L"Car120.bmp";
else if(d > __D(50) && d < __D( 70) ) strFileName =L"Car150.bmp";
else if(d > __D(80) && d < __D(100) ) strFileName =L"Car180.bmp";
else if(d > __D(110) && d < __D(130) ) strFileName =L"Car210.bmp";
else if(d > __D(140) && d < __D(160) ) strFileName =L"Car240.bmp";
else if(d > __D(170) && d < __D(190) ) strFileName =L"Car270.bmp";
else if(d > __D(200) && d < __D(220) ) strFileName =L"Car300.bmp";
else if(d > __D(230) && d < __D(250) ) strFileName =L"Car330.bmp";
else if(d > __D(260) && d < __D(280) ) strFileName =L"Car0.bmp";
else if(d > __D(290) && d < __D(310) ) strFileName =L"Car30.bmp";
else if(d > __D(320) && d < __D(340) ) strFileName =L"Car60.bmp";
else strFileName =L"Car90.bmp";
feature.GetStyle().SetSymbolBitmapName(strFileName);
}
CATCH (COleDispatchException,e)
{
}
AND_CATCH (COleException,e)
{
}
END_CATCH
}
void CGpsSet::UpdateFeature(CMapXFeature &feature)
{
TRY
{
UpdateDirection(feature);
feature.GetPoint().Set( m_dCX, m_dCY);
feature.Update();
ZoomTo();
}
CATCH (COleDispatchException,e)
{
}
AND_CATCH (COleException,e)
{
}
END_CATCH
}
void CGpsSet::SetStartXY(double x,double y)
{
TRY
{
int nxDegree = (int)(x/double(100)),
nyDegree = (int)(y/double(100));
m_dCX = nxDegree + ( x/double(100) - nxDegree )* 100 / 60;
m_dCY = nyDegree + ( y/double(100) - nyDegree )* 100 / 60;
if( ! FindLayer( L"CarLayer") )
{
m_ctrlMapX.GetLayers().SetAnimationLayer(
m_ctrlMapX.GetLayers().CreateLayer( L"CarLayer",NULL,1) );
}
if( ! m_nFeaID )
{
CMapXFeature m_CurFeature;
m_CurrentCarLayer.SetEditable(TRUE);
m_CurFeature.CreateDispatch(m_CurFeature.GetClsid());
m_CurFeature.Attach( m_ctrlMapX.GetDispatch());
m_CurFeature.GetStyle().SetSymbolType(miSymbolTypeBitmap);
m_CurFeature.GetStyle().SetSymbolBitmapSize(16);
m_CurFeature.GetStyle().SetSymbolBitmapTransparent(TRUE);
m_CurFeature.GetStyle().SetSymbolBitmapName(L"Car.bmp");
m_CurFeature.GetPoint().Set( m_dCX, m_dCY);
m_CurFeature = m_CurrentCarLayer.AddFeature(m_CurFeature);
m_nFeaID = m_CurFeature.GetFeatureID();
m_ctrlMapX.ZoomTo(NZOOM,m_dCX,m_dCY);
}
}
CATCH (COleDispatchException,e)
{
e->ReportError();
}
AND_CATCH (COleException,e)
{
e->ReportError();
}
END_CATCH
}
bool CGpsSet::FindLayer(CString strLayerName)
{
TRY
{
CMapXLayer mLayer;
CMapXLayers layers= m_ctrlMapX.GetLayers();
for(int i=0;i<layers.GetCount();i++)
{
mLayer=layers.Item(i+1);
if(mLayer.GetName()==strLayerName)
{
m_CurrentCarLayer = mLayer;
return true;
}
}
}
CATCH (COleDispatchException,e)
{
}
AND_CATCH (COleException,e)
{
}
END_CATCH
return false;
}
void CGpsSet::RemoveCurrent()
{
TRY
{
m_CurrentCarLayer.AllFeatures().RemoveByID( m_nFeaID);
}
CATCH (COleDispatchException,e)
{
}
AND_CATCH (COleException,e)
{
}
END_CATCH
}
void CGpsSet::RemoveAll()
{
TRY
{
CMapXFeatures fs = m_CurrentCarLayer.AllFeatures();
int nCount = fs.GetCount();
for(int i=1; i < nCount+1; i++)
fs.Remove( i );
}
CATCH (COleDispatchException,e)
{
}
AND_CATCH (COleException,e)
{
}
END_CATCH
}
BEGIN_MESSAGE_MAP(CGpsSet, CWnd)
//{{AFX_MSG_MAP(CGpsSet)
ON_WM_SETFOCUS()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BEGIN_EVENTSINK_MAP(CGpsSet, CWnd)
ON_EVENT(CGpsSet, IDC_MAP, MAPX_DISPID_TOOLUSED, OnToolUsed, VTS_I2 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_BOOL VTS_BOOL VTS_PVARIANT)
ON_EVENT(CGpsSet, IDC_MAP, MAPX_DISPID_DRAWUSERLAYER, OnDrawUserLayer, VTS_DISPATCH VTS_I4 VTS_I4 VTS_DISPATCH VTS_DISPATCH)
END_EVENTSINK_MAP()
// GIS Message
void CGpsSet::OnDrawUserLayer(LPDISPATCH Layer, long hOutputDC, long hAttributeDC, LPDISPATCH RectFull, LPDISPATCH RectInvalid)
{
// CDC dc;
// dc.Attach((HDC)hOutputDC);
// dc.SetAttribDC((HDC)hAttributeDC);
// DrawScaleBar(&dc);
}
void CGpsSet::OnToolUsed(short ToolNum, double X1, double Y1, double X2, double Y2, double Distance, BOOL Shift, BOOL Ctrl, VARIANT* EnableDefault)
{
}
void CGpsSet::OnViewScalebar()
{
// m_ctrlMapX.OnClose();
}
void CGpsSet::ShowCurrentFeature()
{
}
void CGpsSet::HideCurrentFeature()
{
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?