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

📄 mapview.cpp

📁 用VC开发的GPS监控跟踪软件,已经调试过,并在实际中使用,现与大家共享
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// MapView.cpp : implementation of the CMapView class
//

#include "stdafx.h"
#include "MapDemo.h"
#include "MapDemoDoc.h"
#include "MapView.h"
#include "MapFormView.h"
#include "MainFrm.h"
#include "GeoSetDlg.h"
#include "MapXSetDlg.h"
#include "SelDlg.h"



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



#define IDC_MAP 100

#define MYTOOL_INFO 1
#define MYTOOL_DISTANCE 2
/////////////////////////////////////////////////////////////////////////////
// CMapView

IMPLEMENT_DYNCREATE(CMapView, CView)

BEGIN_MESSAGE_MAP(CMapView, CView)
	//{{AFX_MSG_MAP(CMapView)
	ON_WM_SIZE()
	ON_WM_CREATE()
	ON_COMMAND(ID_FILE_OPENGEOSET, OnFileOpengeoset)
	ON_COMMAND(ID_VIEW_SYSOPTION, OnViewSysoption)
	ON_COMMAND(ID_MAP_TOOL_SELECT, OnMapToolSelect)
	ON_COMMAND(ID_MAP_TOOL_ZOOMIN, OnMapToolZoomin)
	ON_COMMAND(ID_MAP_TOOL_ZOOMOUT, OnMapToolZoomout)
	ON_COMMAND(ID_MAP_TOOL_PAN, OnMapToolPan)
	ON_COMMAND(ID_MAP_TOOL_RADIUSSELECT, OnMapToolRadiusselect)
	ON_COMMAND(ID_MAP_TOOL_RECTANGLESELECT, OnMapToolRectangleselect)
	ON_COMMAND(ID_MAP_TOOL_INFORMATION, OnMapToolInformation)
	ON_COMMAND(ID_VIEW_LAYERCONTROL, OnViewLayercontrol)
	ON_COMMAND(ID_VIEW_SCALEBAR, OnViewScalebar)
	ON_UPDATE_COMMAND_UI(ID_VIEW_SCALEBAR, OnUpdateViewScalebar)
	ON_COMMAND(ID_TOOL_UNSELECTALL, OnToolUnselectall)
	ON_COMMAND(ID_MAPEDIT_SELETTABLE, OnMapeditSelettable)
	ON_COMMAND(ID_MAPEDIT_ADDTEXT, OnMapeditAddtext)
	ON_COMMAND(ID_MAPEDIT_ADDSYMBOL, OnMapeditAddsymbol)
	ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDTEXT, OnUpdateMapeditAddtext)
	ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDSYMBOL, OnUpdateMapeditAddsymbol)
	ON_COMMAND(ID_MAPEDIT_ADDLINE, OnMapeditAddline)
	ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDLINE, OnUpdateMapeditAddline)
	ON_COMMAND(ID_MAPEDIT_ADDPOLYGON, OnMapeditAddpolygon)
	ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDPOLYGON, OnUpdateMapeditAddpolygon)
	ON_COMMAND(ID_MAPEDIT_ADDRECT, OnMapeditAddrect)
	ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDRECT, OnUpdateMapeditAddrect)
	ON_COMMAND(ID_MAPEDIT_ADDEPPLISE, OnMapeditAddepplise)
	ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDEPPLISE, OnUpdateMapeditAddepplise)
	ON_COMMAND(IDD_MAPEDIT_ADDARC, OnMapeditAddarc)
	ON_UPDATE_COMMAND_UI(IDD_MAPEDIT_ADDARC, OnUpdateMapeditAddarc)
	ON_WM_DESTROY()
	ON_COMMAND(ID_ADD_TARGET, OnAddTarget)
	ON_COMMAND(ID_EDIT_TARGET, OnEditTarget)
	ON_COMMAND(ID_START_GPS, OnStartGps)
	ON_UPDATE_COMMAND_UI(ID_START_GPS, OnUpdateStartGps)
	ON_COMMAND(ID_END_GPS, OnEndGps)
	ON_UPDATE_COMMAND_UI(ID_END_GPS, OnUpdateEndGps)
	ON_UPDATE_COMMAND_UI(ID_ADD_TARGET, OnUpdateAddTarget)
	ON_UPDATE_COMMAND_UI(ID_EDIT_TARGET, OnUpdateEditTarget)
	ON_COMMAND(ID_GPS_CHANGESYMBOL, OnGpsChangesymbol)
	ON_UPDATE_COMMAND_UI(ID_GPS_CHANGESYMBOL, OnUpdateGpsChangesymbol)
	ON_WM_TIMER()
	ON_COMMAND(ID_CHANGE_SYMBOL, OnChangeSymbol)
	ON_UPDATE_COMMAND_UI(ID_CHANGE_SYMBOL, OnUpdateChangeSymbol)
	ON_COMMAND(ID_LINE_CHANGE, OnLineChange)
	ON_COMMAND(ID_REAGION_CHANGE, OnReagionChange)
	ON_COMMAND(ID_MAPX_PROPERTY, OnMapxProperty)
	ON_COMMAND(ID_DATABIND_NORMAL, OnDatabindNormal)
	ON_UPDATE_COMMAND_UI(ID_DATABIND_NORMAL, OnUpdateDatabindNormal)
	ON_COMMAND(ID_BINDDATA_ODBC, OnBinddataOdbc)
	ON_UPDATE_COMMAND_UI(ID_BINDDATA_ODBC, OnUpdateBinddataOdbc)
	ON_COMMAND(ID_BINDDATA_ARRAY, OnBinddataArray)
	ON_UPDATE_COMMAND_UI(ID_BINDDATA_ARRAY, OnUpdateBinddataArray)
	ON_COMMAND(ID_BINDDATA_NOBIND, OnBinddataNobind)
	ON_UPDATE_COMMAND_UI(ID_BINDDATA_NOBIND, OnUpdateBinddataNobind)
	ON_COMMAND(ID_THEME_REANGE, OnThemeReange)
	ON_UPDATE_COMMAND_UI(ID_THEME_REANGE, OnUpdateThemeReange)
	ON_COMMAND(ID_THEME_DOT, OnThemeDot)
	ON_UPDATE_COMMAND_UI(ID_THEME_DOT, OnUpdateThemeDot)
	ON_COMMAND(ID_THEME_PIE, OnThemePie)
	ON_UPDATE_COMMAND_UI(ID_THEME_PIE, OnUpdateThemePie)
	ON_COMMAND(ID_THEME_SYMBOL, OnThemeSymbol)
	ON_UPDATE_COMMAND_UI(ID_THEME_SYMBOL, OnUpdateThemeSymbol)
	ON_COMMAND(ID_THEME_INDIV, OnThemeIndiv)
	ON_UPDATE_COMMAND_UI(ID_THEME_INDIV, OnUpdateThemeIndiv)
	ON_COMMAND(ID_THEME_BAR, OnThemeBar)
	ON_UPDATE_COMMAND_UI(ID_THEME_BAR, OnUpdateThemeBar)
	//}}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()
////////////////////////////////////////////////////////
//MapX事件响应函数
//使用用户自定义图层
BEGIN_EVENTSINK_MAP(CMapView, CView)



ON_EVENT(CMapView, IDC_MAP, MAPX_DISPID_DRAWUSERLAYER, OnDrawUserLayer, VTS_DISPATCH VTS_I4 VTS_I4 VTS_DISPATCH VTS_DISPATCH)
ON_EVENT(CMapView, IDC_MAP, MAPX_DISPID_TOOLUSED, OnToolUsed, VTS_I2 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_BOOL VTS_BOOL VTS_PBOOL)                                                                                        
ON_EVENT(CMapView, IDC_MAP, MAPX_DISPID_POLYTOOLUSED, OnPolyToolUsedMap, VTS_I2 VTS_I4 VTS_DISPATCH VTS_BOOL VTS_BOOL VTS_PBOOL)
ON_EVENT(CMapView, IDC_MAP, -605 /* MouseDown */, OnMouseDownMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4)
ON_EVENT(CMapView, IDC_MAP, DISPID_MOUSEUP, OnMouseUpInMap, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
ON_EVENT(CMapView, IDC_MAP, DISPID_MOUSEMOVE, OnMouseMoveInMap, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)


END_EVENTSINK_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMapView construction/destruction

CMapView::CMapView()
{
	m_dPrevZoom = 0;
	m_dCurZoom = 0;
	m_bScaleBar = FALSE;
	//m_bODBCDynamic = FALSE;
	m_strEditLayer="";
	m_bIsStartGps=FALSE;
	m_nGpsOperation=GPS_NOOPERATION;
	m_bIsAutoLable=FALSE;
	m_pTarget=NULL;

}

CMapView::~CMapView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMapView drawing

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

/////////////////////////////////////////////////////////////////////////////
// CMapView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CMapView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CMapView message handlers

void CMapView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	if (cx != 0 && cy != 0)
		m_ctrlMapX.MoveWindow(0,0,cx,cy,TRUE);	
}

BOOL CMapView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

int CMapView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
    // 使用缺省尺寸创建一个地图
	// 在OnSize函数里改变地图控件的大小,使之缩放到屏幕尺寸
	m_ctrlMapX.Create(NULL, WS_VISIBLE, CRect(0,0,100,100), this, IDC_MAP);

	// 创建距离工具
	try {
		// create some custom tools for object drawing
		m_ctrlMapX.CreateCustomTool(MYTOOL_DISTANCE, miToolTypePoly, miCrossCursor);
		m_ctrlMapX.CreateCustomTool(MYTOOL_INFO, miToolTypePoint, miCrossCursor);

        //绘图工具 
        m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_TEXT_TOOL,miToolTypePoint,miCrossCursor);
		m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_SYMBOL_TOOL,miToolTypePoint,miCrossCursor);
		m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_LINE_TOOL,miToolTypeLine,miCrossCursor);
		m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_ELLIPSE_TOOL,miToolTypeMarquee,miCrossCursor);
		m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_RECT_TOOL,miToolTypeMarquee,miCrossCursor);
		m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_REGION_TOOL,miToolTypePoly,miCrossCursor);
		m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_ARC_TOOL,miToolTypeLine,miCrossCursor);
	    //GPS工具
		m_ctrlMapX.CreateCustomTool(GPS_ADDTARGET,miToolTypePoint,miArrowCursor);
		m_ctrlMapX.CreateCustomTool(GPS_EDITTARGET,miToolTypePoint,miArrowCursor);

		




		
	}
	catch (COleDispatchException *e) {
		e->ReportError();
		e->Delete();
	}
	catch (COleException *e) {
		e->ReportError();
		e->Delete();
	}
	SetTitleVisible(FALSE);
    OnViewScalebar();	
	return 0;
}
void CMapView::NotifyQueryNewPalette()
{
	// we don't care, but our embedded control might
	m_ctrlMapX.SendMessage(WM_QUERYNEWPALETTE);
}
void CMapView::NotifyPaletteChanged(CWnd* pFocusWnd)
{
	// we don't care, but our embedded control might
	m_ctrlMapX.SendMessage(WM_PALETTECHANGED, (WPARAM)(pFocusWnd->m_hWnd));
}


void CMapView::OnFileOpengeoset() 
{
	CGeoSetDlg geoDlg(&m_ctrlMapX);
	geoDlg.DoModal();
}


void CMapView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	
	
}

void CMapView::OnViewSysoption() 
{
	MapXSetDlg dlg(&m_ctrlMapX);
	dlg.DoModal();
	
}

void CMapView::OnMapToolSelect() 
{
	m_ctrlMapX.SetCurrentTool(miSelectTool);
	
}

void CMapView::OnMapToolZoomin() 
{
	m_ctrlMapX.SetCurrentTool(miZoomInTool);
	
}

void CMapView::OnMapToolZoomout() 
{
	m_ctrlMapX.SetCurrentTool(miZoomOutTool);
}

void CMapView::OnMapToolPan() 
{
	m_ctrlMapX.SetCurrentTool(miPanTool);
	
}

void CMapView::OnMapToolRadiusselect() 
{
	m_ctrlMapX.SetCurrentTool(miRadiusSelectTool);
	
}

void CMapView::OnMapToolRectangleselect() 
{
	m_ctrlMapX.SetCurrentTool(miRectSelectTool);
	
}

void CMapView::OnMapToolInformation() 
{
	m_ctrlMapX.SetCurrentTool(miRectSelectTool);
	
}

void CMapView::OnToolUnselectall() 
{
	
    CMapXLayers layers=m_ctrlMapX.GetLayers();

	for(int i=0;i<layers.GetCount();i++)
	{
		CMapXLayer layer=layers.Item(i+1);
		if(layer.GetSelectable())
		{
			CMapXSelection select=layer.GetSelection();
			if(select.GetCount()>0) 
			select.ClearSelection();
        }
    }

	
}

// Draw the Scalebar layer whenever this event is called
// we could check the Layer.Name property if we needed to handle
// more than 1 user draw layer


void CMapView::OnDrawUserLayer(LPDISPATCH Layer, long hOutputDC, long hAttributeDC, LPDISPATCH RectFull, LPDISPATCH RectInvalid)
{
	CDC dc;
	dc.Attach((HDC)hOutputDC);
	dc.SetAttribDC((HDC)hAttributeDC);
	DrawScaleBar(&dc);
}

void CMapView::OnViewLayercontrol() 
{
		try {
		VARIANT vHelpFile, vHelpID;		// mark as optional since we don't have a helpfile
		vHelpFile.vt = VT_ERROR;
		vHelpFile.scode = DISP_E_PARAMNOTFOUND;
		vHelpID.vt = VT_ERROR;
		vHelpID.scode = DISP_E_PARAMNOTFOUND;
		CMapXLayers layers = m_ctrlMapX.GetLayers();
		layers.LayersDlg(vHelpFile, vHelpID);
	}
	catch (COleDispatchException *e) {
		e->ReportError();
		e->Delete();
	}
	catch (COleException *e) {
		e->ReportError();
		e->Delete();
	}
	
	
}


//用户自定义图层绘制比例尺

void CMapView::OnViewScalebar() 
{
	try {
		if(m_bScaleBar)
		{
			m_ctrlMapX.GetLayers().Remove("ScaleBar");
			m_bScaleBar = FALSE;	
		}
		else
		{
			m_ctrlMapX.GetLayers().AddUserDrawLayer("ScaleBar", 1);
			m_bScaleBar = TRUE;
		}
	}
	catch (COleDispatchException *e) {
		e->ReportError();
		e->Delete();
	}
	catch (COleException *e) {
		e->ReportError();
		e->Delete();
	}
	
}

void CMapView::OnUpdateViewScalebar(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_bScaleBar);
	
}

void CMapView::DrawScaleBar(CDC *pDC)
{
	
	float barWidth =(float)0.5, barHeight =(float)0.08;
	float startX =(float).3, startY =(float).3;
	long x1, y1;
	int i;

	// attach to dc that mapx passed us so we can use 
	// mfc CDC object. (we will detach before exiting this method

	CPen pen;
	CBrush brushRed, brushWhite, *pOldBrush;
	CFont *pOldFont;
	
	pen.CreatePen(0,1,(COLORREF)0);
	brushRed.CreateSolidBrush(255);
	brushWhite.CreateSolidBrush(16777215);


	//Set map mode to HI-English
	pDC->SetMapMode(MM_HIENGLISH);
	//Set pen to black
	CPen *pOldPen = pDC->SelectObject(&pen);
	pOldBrush = pDC->SelectObject(&brushRed);

	//convert to HiEnglish, Conversion needed because one HIENGLISH unit is .001 inch
	x1=(long)(startX*1000);
	y1=(long)(startY*1000);
	barWidth*=1000;
	barHeight*=1000;

	for (i=0; i<=1; i++) {
		long x2 =(long)(barWidth+x1);
		long y2 =(long)(barHeight+y1);
	
		/*** First Section  ***/
		if (i==0) {
			pDC->SelectObject(&brushRed); //Red
		}
		else {
			pDC->SelectObject(&brushWhite); //White
		}

		// with mapMode HIENGLISH, positive is x to the right, positive y is up
		pDC->Rectangle(x1, -y1, x2, -y2);

		/*** Second Section ***/
		x1=x2;
		x2=(long)(barWidth+x1);
		if (i==0) {
			pDC->SelectObject(&brushWhite); //White
		}
		else {
			pDC->SelectObject(&brushRed); //Red
		}
		pDC->Rectangle(x1, -y1, x2, -y2);

		/*** Third Section ***/
		x1=x2;
		x2=(long)(barWidth*2+x1);
		if (i==0) {
			pDC->SelectObject(&brushRed); //Red
		}
		else {
			pDC->SelectObject(&brushWhite); //White
		}
		pDC->Rectangle(x1, -y1, x2, -y2);
		
		/*** Reset Values for bottom bar pass***/
		x1=(long)(startX*1000);
		y1=y2;
	}  // End For

	// Calculate Pixels Per Inch
	CPoint pt(1000, 1000); // In HIENGLISH 1000 units = 1 inch
	pDC->LPtoDP(&pt);  // Convert inch to pixel
	long lPixPerInch = pt.x;

	CRect rc;
	CView::GetClientRect(&rc);

	float screenX, screenY;
	double mapX1, mapY1;

⌨️ 快捷键说明

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