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

📄 mapperview.cpp

📁 vc 和mapobjects地理信息系统组件开发 很有启发意义和参考价值
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// mapperView.cpp : implementation of the CMapperView class
//

#include "stdafx.h"
#include "mapper.h"

#include "mapperDoc.h"
#include "mapperView.h"

#include "seisunshisetdlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMapperView

IMPLEMENT_DYNCREATE(CMapperView, CFormView)

BEGIN_MESSAGE_MAP(CMapperView, CFormView)
	//{{AFX_MSG_MAP(CMapperView)
	ON_WM_SIZE()
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_QUERY_CLEAR_2, OnQueryClear2)
	ON_COMMAND(ID_QUERY_RECORD_2, OnQueryRecord2)
	ON_COMMAND(ID_SEIS_EQ3_2, OnSeisEq32)
	ON_COMMAND(ID_SEIS_EQ3_CLEAR_2, OnSeisEq3Clear2)
	ON_COMMAND(ID_SEIS_EQ3_SHP_2, OnSeisEq3Shp2)
	ON_COMMAND(ID_SEIS_LIEDU_2, OnSeisLiedu2)
	ON_COMMAND(ID_SEIS_LIEDU_CLEAR_2, OnSeisLieduClear2)
	ON_COMMAND(ID_SEIS_LIEDU_QUERY_2, OnSeisLieduQuery2)
	ON_COMMAND(ID_SEIS_SHP_2, OnSeisShp2)
	ON_COMMAND(ID_SEIS_SUNSHI_2, OnSeisSunshi2)
	ON_COMMAND(ID_SEIS_SUNSHI_CLEAR_2, OnSeisSunshiClear2)
	ON_COMMAND(ID_SHAPE_CLEAR_2, OnShapeClear2)
	ON_COMMAND(ID_SHAPE_CLEAR_ALL_2, OnShapeClearAll2)
	ON_COMMAND(ID_SHAPE_DATA_2, OnShapeData2)
	ON_COMMAND(ID_SHAPE_DELETE_2, OnShapeDelete2)
	ON_COMMAND(ID_SHAPE_EXPORT_SHP_2, OnShapeExportShp2)
	ON_COMMAND(ID_SHAPE_OPEN_2, OnShapeOpen2)
	ON_COMMAND(ID_SHAPE_SAVE_2, OnShapeSave2)
	ON_COMMAND(ID_SHAPE_SETUP_2, OnShapeSetup2)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMapperView construction/destruction

CMapperView::CMapperView()
	: CFormView(CMapperView::IDD)
{
	//{{AFX_DATA_INIT(CMapperView)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// TODO: add construction code here

}

CMapperView::~CMapperView()
{

}

void CMapperView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMapperView)
	DDX_Control(pDX, IDC_MAP, m_map);
	DDX_Control(pDX, IDC_SCALEBAR, m_scale);
	//}}AFX_DATA_MAP
}

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

	return CFormView::PreCreateWindow(cs);
}

void CMapperView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
//	GetParentFrame()->RecalcLayout();
//	ResizeParentToFit();

	m_map.GetLayers().Clear();
	m_pWnd=(CMainFrame*)AfxGetMainWnd();

	int count=theApp.m_taEli.GetSize();
	SMpfLayerInfo mli;
	CString sType;
	CFileFind ff;
	CString s;
	for(int i=0;i<count;i++)
	{
		mli=theApp.m_taEli[i];
		sType=mli.szType;

		//判断文件是否存在
		if(!ff.FindFile(mli.szPathFile))
		{
			s.Format("%s 图层不存在!",mli.szPathFile);
			AfxMessageBox(s);
			continue;
		}

		if(sType=="[1]")
		{
			Eng_AddLayerMap(m_map,mli.szPathFile,mli.crColor);
		}
		if(sType=="[2]")
		{
			Eng_AddLayerImage(m_map,mli.szPathFile,mli.crColor);
		}
		if(sType=="[3]")
		{
			Eng_AddLayerCad(m_map,mli.szPathFile,mli.crColor);
		}
		if(sType=="[4]")
		{
			Eng_AddLayerArc(m_map,mli.szPathFile,mli.crColor);
		}
		if(sType=="[5]")
		{
			Eng_AddLayerArc(m_map,mli.szPathFile,mli.crColor);
		}

		//新层总是在0层
		Sub_SetLayerInfo(sType,mli);
	}

	m_map.SetBackColor(theApp.m_tMapInfo.crBack);
	Eng_SetLegend(m_map,theApp.GetLayerPane()->m_legend);

//程序内套用调用时候,map尺寸不变
	if(m_map.m_hWnd)
	{
		CRect rect;
		GetClientRect(&rect);
		m_map.SetWindowPos(0,0,0,rect.Width(),rect.Height(),SWP_NOZORDER);
	}

	m_bPressed=FALSE;
}

/////////////////////////////////////////////////////////////////////////////
// CMapperView printing

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

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

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

void CMapperView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
	CRect frame(0, 0, ::GetDeviceCaps(pDC->m_hAttribDC, HORZRES), 
	   ::GetDeviceCaps(pDC->m_hAttribDC, VERTRES));
	FrameMap(m_map, pDC, frame);

}

/////////////////////////////////////////////////////////////////////////////
// CMapperView diagnostics

#ifdef _DEBUG
void CMapperView::AssertValid() const
{
	CFormView::AssertValid();
}

void CMapperView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CMapperView message handlers

void CMapperView::OnSize(UINT nType, int cx, int cy) 
{
	CFormView::OnSize(nType, cx, cy);
	
	if(m_map.m_hWnd)
		m_map.SetWindowPos(0,0,0,cx,cy,SWP_NOZORDER);
//	if(m_scale.m_hWnd)
//		m_scale.SetWindowPos(0,10,cy-30,160,20,SWP_NOZORDER);
	if(m_scale.m_hWnd)
		m_scale.ShowWindow(SW_HIDE);
}

BEGIN_EVENTSINK_MAP(CMapperView, CFormView)
    //{{AFX_EVENTSINK_MAP(CMapperView)
	ON_EVENT(CMapperView, IDC_MAP, -605 /* MouseDown */, OnMouseDownMap, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
	ON_EVENT(CMapperView, IDC_MAP, -606 /* MouseMove */, OnMouseMoveMap, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
	ON_EVENT(CMapperView, IDC_MAP, 4 /* AfterTrackingLayerDraw */, OnAfterTrackingLayerDrawMap, VTS_I4)
	ON_EVENT(CMapperView, IDC_MAP, -607 /* MouseUp */, OnMouseUpMap, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CMapperView::OnMouseDownMap(short Button, short Shift, long X, long Y) 
{
	switch(m_pWnd->m_uID)
	{
	case ID_SHAPE_SELECT:
		{
			m_bPressed=TRUE;
			m_ptPressed=m_map.ToMapPoint((float)X,(float)Y);
		}
		m_oShape.HitTest(m_map,X,Y);
		m_map.Refresh();
		break;
	case ID_SHAPE_POINT:
		m_oShape.mo_AddPoint(m_map,X,Y);
		break;
	case ID_SHAPE_LINE:
		m_oShape.mo_AddLine(m_map);
		break;
	case ID_SHAPE_RECT:
		m_oShape.mo_AddRect(m_map);
		break;
	case ID_SHAPE_CIRCLE:
		m_oShape.mo_AddCircle(m_map);
		break;
	case ID_SHAPE_ELLIPSE:
		m_oShape.mo_AddEllipse(m_map);
		break;
	case ID_SHAPE_POLY:
		m_oShape.mo_AddPoly(m_map);
		break;
	case ID_SHAPE_TEXT:
		m_oShape.mo_AddText(m_map);
		break;
	case ID_QUERY_POINT:
		{
			CMoPoint	pt(m_map.ToMapPoint((float)X, (float)Y));
//			const double tolerance = m_map.ToMapDistance((float)5);	//运行5个像素???
			double tolerance = m_map.ToMapDistance((float)theApp.m_tMapSetup.nPickTol);
			short iLayer=theApp.GetLayerPane()->m_legend.getActiveLayer();
			CMoMapLayer layer=m_map.GetLayers().Item(COleVariant(iLayer));
			if(layer.m_lpDispatch==NULL)
			{
				AfxMessageBox("必须先选择一个图层!");
				return;
			}
			m_sQuery=layer.GetName();
			m_rsQuery=layer.SearchByDistance(pt, tolerance, TEXT(""));

			VARIANT va;
			VariantInit(&va);
			va.vt = VT_NULL; 
			m_map.GetTrackingLayer().Refresh(true,va);

			//无选中对象,不弹出对话框
			if(m_rsQuery.GetCount()<=0)
			{
				if(m_dlgRs.m_hWnd)
					m_dlgRs.ShowWindow(SW_HIDE);
				return;
			}

			if(!m_dlgRs.m_hWnd)
				m_dlgRs.Create(IDD_RECORD_DATA,AfxGetMainWnd());
			else
				m_dlgRs.ShowWindow(SW_SHOW);
			{
				m_dlgRs.m_oData.DeleteAllItems();
	
				if(LPDISPATCH(m_rsQuery)!=0)
				{
					CMoTableDesc table=m_rsQuery.GetTableDesc();
					CMoFields fields(m_rsQuery.GetFields());	
					m_rsQuery.MoveFirst();
					for(short i=0;i<table.GetFieldCount();i++)
					{
						CMoField field(fields.Item(COleVariant(table.GetFieldName(i))));
						m_dlgRs.m_oData.InsertItem(i,table.GetFieldName(i));
						m_dlgRs.m_oData.SetItemText(i,1,field.GetValueAsString());
					}
				}
			}
		}
		break;
	case ID_QUERY_LINE:
		{
			CMoLine l=m_map.TrackLine();
			if((l.m_lpDispatch!=NULL)&&(Button==1))	//右键不运行
			{
				short iLayer=theApp.GetLayerPane()->m_legend.getActiveLayer();
				if(iLayer<0) 
					return;
				
				CMoMapLayer layer=m_map.GetLayers().Item(COleVariant(iLayer));
				m_sQuery=layer.GetName();
				m_rsQuery= layer.SearchShape(l, moAreaIntersect, TEXT(""));

				VARIANT va;
				VariantInit(&va);
				va.vt = VT_NULL; 
				m_map.GetTrackingLayer().Refresh(true,va);
			}
		}
		break;
	case ID_QUERY_RECT:
		{
			CMoRectangle r=m_map.TrackRectangle();
			if((r.m_lpDispatch!=NULL)&&(Button==1))	//右键不运行
			{
				short iLayer=theApp.GetLayerPane()->m_legend.getActiveLayer();
				if(iLayer<0) 
					return;
				
				CMoMapLayer layer=m_map.GetLayers().Item(COleVariant(iLayer));
				m_sQuery=layer.GetName();
				m_rsQuery = layer.SearchShape(r, moAreaIntersect, TEXT(""));

				VARIANT va;
				VariantInit(&va);
				va.vt = VT_NULL; 
				m_map.GetTrackingLayer().Refresh(true,va);
			}
		}
		break;

	case ID_QUERY_POLY:
		{
			CMoPolygon p=m_map.TrackPolygon();
			if((p.m_lpDispatch!=NULL)&&(Button==1))	//右键不运行
			{
				short iLayer=theApp.GetLayerPane()->m_legend.getActiveLayer();
				if(iLayer<0) 
					return;
				
				CMoMapLayer layer=m_map.GetLayers().Item(COleVariant(iLayer));
				m_sQuery=layer.GetName();
				m_rsQuery = layer.SearchShape(p, moAreaIntersect, TEXT(""));

				VARIANT va;
				VariantInit(&va);
				va.vt = VT_NULL; 
				m_map.GetTrackingLayer().Refresh(true,va);
			}
		}
		break;

	case ID_QUERY_DISTANCE:
		{
			//跟踪屏幕坐标才可以动态提供距离数据,但是需要自己控制,很麻烦

			//使用map功能则只能最后提供结果
			// Track a new line
			m_oQueryLine =m_map.TrackLine();
			if (LPDISPATCH(m_oQueryLine))
			{
				double ll=m_oQueryLine.GetLength();
				double km=ll*111.11;	//默认为:度
				CString s;
				s.Format("距离: d=%lf(km)",km);
				m_pWnd->MsgOutBar(s,3);
//				CMoRectangle r = CMoRectangle(m_oDistLine.GetExtent());
//				m_map.RefreshRect(r.m_lpDispatch);
				m_map.Refresh();
			}
		}
		break;

	case ID_QUERY_AREA:
		{
			m_oQueryPoly=m_map.TrackPolygon();
			if (LPDISPATCH(m_oQueryPoly))
			{
				double a=m_oQueryPoly.GetArea();
				CString s;
				s.Format("面积: a=%lf",a);
				m_pWnd->MsgOutBar(s,3);
				m_map.Refresh();
			}
		}
		break;

	case ID_DRAW_ZOOMIN:
		{
			CMoRectangle r(m_map.TrackRectangle());
			if(LPDISPATCH(r))
				m_map.SetExtent(r);
		}
		break;
	
	case ID_DRAW_ZOOMOUT:
		{
			CMoRectangle r(m_map.GetExtent());
			if(LPDISPATCH(r))
			{
				r.ScaleRectangle(1.5);
				m_map.SetExtent(r);
			}
		}
		break;

	case ID_DRAW_PAN:
		m_map.Pan();
		break;
/*
	case ID_SEIS_SUNSHI:
		{
			CSeiSunShiSetDlg ssssd;
			ssssd.m_nMin=m_oLiedu.m_nLiedu0;
			ssssd.m_nMax=m_oLiedu.m_nLiedu1;
			if(ssssd.DoModal()!=IDOK)
				return;

⌨️ 快捷键说明

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