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

📄 digitalmapview.cpp

📁 VC++开发广州市交通运输干线
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		m_nStaComeBk = 0;
		m_nStaRTZoom = 0;
	}
}

void CDigitalMapView::OnPan() 
{
	CDigitalMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_bMapLoad)
	{
		m_nCurStatus = ID_CUR_PAN;
		//
		m_nStaZoomIn = 0;
		m_nStaZoomOut = 0;
		m_nStaPan = 1;
		m_nStaComeBk = 0;
		m_nStaRTZoom = 0;
	}
}

BOOL CDigitalMapView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	switch(m_nCurStatus)
	{
		case ID_CUR_ZOOMOUT:
		SetCursor(AfxGetApp()->LoadCursor(IDC_ZOOMOUT));
		return true;
		
		case ID_CUR_ZOOMIN:
		case ID_CUR_RTZOOM:
		SetCursor(AfxGetApp()->LoadCursor(IDC_ZOOMIN));
		return true;
		
		case ID_CUR_PAN:
		SetCursor(AfxGetApp()->LoadCursor(IDC_PAN));
		return true;

		case ID_CUR_PT_SLT:
		SetCursor(AfxGetApp()->LoadCursor(IDC_PT_SELECT));
		return true;

		case ID_CUR_RT_SLT:
		SetCursor(AfxGetApp()->LoadCursor(IDC_RT_SELECT));
		return true;

		case ID_CUR_CI_SLT:
		SetCursor(AfxGetApp()->LoadCursor(IDC_CI_SELECT));
		return true;
		
		default:
		{
		}
		return CView::OnSetCursor(pWnd, nHitTest, message);
	}
	return CView::OnSetCursor(pWnd, nHitTest, message);
}

void CDigitalMapView::ZoomIn(double k, POINT mousepoint)
{
	//计算当前窗口的大小
	unsigned long dx = labs(m_RoundRect.right - m_RoundRect.left);
	unsigned long dy = labs(m_RoundRect.top - m_RoundRect.bottom);
	
	//得到当前视口客户区域的矩形范围
	CRect rcEnd;
	GetClientRect(rcEnd);
	//得到视图客户区域大小
	long nHScreen = rcEnd.Height();
	long nWScreen = rcEnd.Width();
	
	//调整缩放窗口范围与视图客户区域范围相似
	if(dx - dy >= 0.0)
	{
		dy = nHScreen*dx/nWScreen;
	}
	else if(dx - dy < 0.0)
	{
		dx = nWScreen*dy/nHScreen;
	}
	
	//得到新的窗口范围
	m_RoundRect.left=(long)(mousepoint.x - dx * k);
	m_RoundRect.right=(long)(mousepoint.x + dx * k);
	m_RoundRect.top=(long)(mousepoint.y + dy * k);
	m_RoundRect.bottom=(long)(mousepoint.y - dy * k);
}

void CDigitalMapView::ZoomOut(double k, POINT mousepoint)
{
	ZoomIn(k,mousepoint);
}

void CDigitalMapView::ZoomInRect()
{
	//求出拉框矩形中心点的逻辑坐标
	POINT center;
	center.x = (m_rtZoom.left+m_rtZoom.right)/2;
	center.y = (m_rtZoom.top+m_rtZoom.bottom)/2;
	
	//计算相似系数
	unsigned long dx = labs(m_RoundRect.right - m_RoundRect.left);
	unsigned long dy = labs(m_RoundRect.top - m_RoundRect.bottom);
	double kx = double(fabs((double)m_rtZoom.right - m_rtZoom.left)/dx);
	double ky = double(fabs((double)m_rtZoom.top - m_rtZoom.bottom)/dy);
	double k = (kx- ky)>0?kx:ky;
	
	ZoomIn(k/2,center);
}

void CDigitalMapView::ZoomPan()
{
	//计算移动的位移量
	double detX=0,detY=0;
	detX = m_rtZoom.right - m_rtZoom.left;
	detY = m_rtZoom.top - m_rtZoom.bottom;
	
	//计算位移后的地图显示范围
	m_RoundRect.left = long(m_RoundRect.left -detX);
	m_RoundRect.right = long(m_RoundRect.right -detX);
	m_RoundRect.top = long(m_RoundRect.top + detY);
	m_RoundRect.bottom = long(m_RoundRect.bottom + detY);
	
}

void CDigitalMapView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	CDigitalMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_bMapLoad)
	{
		CClientDC dc(this);
		dc.SetROP2(R2_NOTXORPEN);
		
		OnPrepareDC(&dc);
		//记录鼠标点击的位置(设备坐标)
		POINT mousepoint = point;
		
		//由设备坐标(客户区坐标)转换为逻辑坐标(窗口坐标)
		dc.DPtoLP(&mousepoint);
		//点漫游操作
		if(ID_CUR_PAN == m_nCurStatus)
		{
			m_rtZoom.right = mousepoint.x;
			m_rtZoom.bottom = mousepoint.y;
			ZoomPan();
			Invalidate(true);
		}	
		if(ID_CUR_ZOOMIN==m_nCurStatus)	//点击放大
		{
			ZoomIn(0.25,mousepoint);
			Invalidate(true);
		}
		if((ID_CUR_RTZOOM==m_nCurStatus)&&(1==m_bLButtDown))	//点击放大
		{
			//清除
			dc.Rectangle(m_rtZoom.left,m_rtZoom.top,m_rtZoom.right,m_rtZoom.bottom);
			
			//记录结束点
			m_rtZoom.right = mousepoint.x;
			m_rtZoom.bottom = mousepoint.y;
			
			//重新绘制
			dc.Rectangle(m_rtZoom.left,m_rtZoom.top,m_rtZoom.right,m_rtZoom.bottom);
			
			//交换矩形两个顶点 避免倒拉框的情况
			if(m_rtZoom.left-m_rtZoom.right > 0 && m_rtZoom.top-m_rtZoom.bottom > 0)
			{
				RECT tmpRect;
				memset(&tmpRect,0x00,sizeof(RECT));
				
				tmpRect.left = m_rtZoom.right;
				tmpRect.right = m_rtZoom.left;
				tmpRect.top = m_rtZoom.bottom;
				tmpRect.bottom = m_rtZoom.top;
				
				m_rtZoom.left = tmpRect.left;
				m_rtZoom.top = tmpRect.top;
				m_rtZoom.right = tmpRect.right;
				m_rtZoom.bottom = tmpRect.bottom;
			}
			//调用矩形放大函数
			ZoomInRect();	
			Invalidate(true);
		}
		m_bLButtDown = 0;
	}
	
	CView::OnLButtonUp(nFlags, point);
}

void CDigitalMapView::OnComeBack() 
{
	CDigitalMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_bMapLoad)
	{
		m_RoundRect = pDoc->m_cGeoMap.m_rtMap;
		Invalidate(true);
		//
		m_nStaZoomIn = 0;
		m_nStaZoomOut = 0;
		m_nStaPan = 0;
		m_nStaRTZoom = 0;
		m_nStaComeBk = 1;
	}
	
}

void CDigitalMapView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	CDigitalMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_bMapLoad)
	{
		CClientDC dc(this);
		dc.SetROP2(R2_NOTXORPEN);
		
		OnPrepareDC(&dc);
		//记录鼠标点击的位置(设备坐标)
		POINT mousepoint = point;
		
		//由设备坐标(客户区坐标)转换为逻辑坐标(窗口坐标)
		dc.DPtoLP(&mousepoint);

		//右键缩小时
		if((ID_CUR_ZOOMOUT==m_nCurStatus)||(ID_CUR_ZOOMIN==m_nCurStatus)||(ID_CUR_RTZOOM==m_nCurStatus))
		{
			ZoomOut(1,mousepoint);
			Invalidate(true);
		}
	}
	
	CView::OnRButtonDown(nFlags, point);
}

void CDigitalMapView::OnUpdateZoomIn(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_nStaZoomIn);
}

void CDigitalMapView::OnUpdateZoomOut(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_nStaZoomOut);
}

void CDigitalMapView::OnUpdatePan(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_nStaPan);
}

void CDigitalMapView::OnUpdateComeBack(CCmdUI* pCmdUI) 
{	
	pCmdUI->SetCheck(m_nStaComeBk);
}




void CDigitalMapView::OnPointSelect() 
{
	CDigitalMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_bMapLoad)
	{
		m_nPTSlct = 1;
		m_nCISlct = 0;
		m_nRTSlct = 0;
		m_nCurStatus = ID_CUR_PT_SLT;
	}
}

void CDigitalMapView::OnUpdatePointSelect(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_nPTSlct);
}

void CDigitalMapView::OnRectSelect() 
{
	CDigitalMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_bMapLoad)
	{
		m_nPTSlct = 0;
		m_nCISlct = 0;
		m_nRTSlct = 1;	
		m_nCurStatus = ID_CUR_RT_SLT;
	}
}

void CDigitalMapView::OnUpdateRectSelect(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_nRTSlct);
}

void CDigitalMapView::OnCircleSelect() 
{
	CDigitalMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_bMapLoad)
	{
		m_nPTSlct = 0;
		m_nCISlct = 1;
		m_nRTSlct = 0;
		m_nCurStatus = ID_CUR_CI_SLT;
	}
}

void CDigitalMapView::OnUpdateCircleSelect(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_nCISlct);
}

void CDigitalMapView::OnMouseMove(UINT nFlags, CPoint point) 
{
	CDigitalMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_bMapLoad)
	{
		CClientDC dc(this);
		dc.SetROP2(R2_NOTXORPEN);

		OnPrepareDC(&dc);
		//记录鼠标点击的位置(设备坐标)
		POINT mousepoint = point;
		
		//由设备坐标(客户区坐标)转换为逻辑坐标(窗口坐标)
		dc.DPtoLP(&mousepoint);
		if((ID_CUR_RTZOOM==m_nCurStatus)&&(1==m_bLButtDown))
		{
			//清除先前的矩形
			dc.Rectangle(m_rtZoom.left,m_rtZoom.top,m_rtZoom.right,m_rtZoom.bottom);
			
			m_rtZoom.right = mousepoint.x;
			m_rtZoom.bottom = mousepoint.y;
			//绘制新矩形
			dc.Rectangle(m_rtZoom.left,m_rtZoom.top,m_rtZoom.right,m_rtZoom.bottom);
		}
	}
	CView::OnMouseMove(nFlags, point);
}

void CDigitalMapView::OnRtZoom() 
{
	CDigitalMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_bMapLoad)
	{
		m_nCurStatus = ID_CUR_RTZOOM;
		//
		m_nStaZoomIn = 0;
		m_nStaZoomOut = 0;
		m_nStaPan = 0;
		m_nStaComeBk = 0;
		m_nStaRTZoom = 1;
	}
}

void CDigitalMapView::OnUpdateRtZoom(CCmdUI* pCmdUI) 
{	
		pCmdUI->SetCheck(m_nStaRTZoom);
}



void CDigitalMapView::OnDataComp() 
{
	CDigitalMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_bMapLoad)
	{
		//打开数据压缩对话框
		CDataCompDlg dlgDataComp;
		dlgDataComp.DoModal();
	}
}

void CDigitalMapView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDigitalMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_bMapLoad)
	{
		CClientDC dc(this);
		dc.SetROP2(R2_NOTXORPEN);
		
		OnPrepareDC(&dc);
		//记录鼠标点击的位置(设备坐标)
		POINT mousepoint = point;
		
		//由设备坐标(客户区坐标)转换为逻辑坐标(窗口坐标)
		dc.DPtoLP(&mousepoint);
		//如果是点击的点选取操作
		if(ID_CUR_PT_SLT==m_nCurStatus)
		{
			CGeoPointXY cGeoPTXY;
			cGeoPTXY.X = mousepoint.x;
			cGeoPTXY.Y = mousepoint.y;
			//由当前点得到格网的位置
			int nHorID = 0;
			int nVerID = 0;
			pDoc->FromPTXYToGridID(cGeoPTXY,nHorID,nVerID);
			//得到当前点所在格网的地物数目
			int nGridGeoNums = pDoc->m_cGeoMap.m_cGeoGrid[nVerID][nHorID].m_vecGeoGdAtt.size();
			for(int i=0;i<nGridGeoNums;i++)
			{
				CGeoGridAttri cGridAttri;
				cGridAttri = pDoc->m_cGeoMap.m_cGeoGrid[nVerID][nHorID].m_vecGeoGdAtt.at(i);
				int nLyerIndex = cGridAttri.m_nLyerIndex;
				//得到当前地物所在层的索引号
				if(GEO_PT_TYPE==cGridAttri.m_nType)
				{
					//如果当前地物是点
					//得到这个点对象的指针
					CGeoLayers cGeoLyer = pDoc->m_cGeoMap.m_vecLayers.at(nLyerIndex);
					CGeoPoint cGeoPoint = cGeoLyer.m_vecPoint.at(cGridAttri.m_nPtIndex);
				}
			}
		}
	}
		
	CView::OnLButtonDblClk(nFlags, point);
}




BOOL CDigitalMapView::ISPTInPLine(CGeoPointXY *pGeoPTXY, int nPTNums, CGeoPointXY cGeoPTXY)
{
	for(int i=0;i<nPTNums;i++)
	{
		float fDiffX = pGeoPTXY[i].X - cGeoPTXY.X;
		float fDiffY = pGeoPTXY[i].Y - cGeoPTXY.Y;
		float fLimit = fDiffX*fDiffX+fDiffY*fDiffY;
		if(fLimit<160)
		{
			return true;
		}
	}
	return false;
}

void CDigitalMapView::OnRefresh() 
{
	// TODO: Add your command handler code here
	Invalidate(true);
}


/* 射线法判断点q与多边形polygon的位置关系,要求polygon为简单多边形
如果点在多边形内:  	返回0
如果点在多边形边上:	返回1
如果点在多边形外:		返回2
*/
int CDigitalMapView::ISPTInPGon(int vcount,POINT Polygon[],POINT q)
{
	
	return 1;
}

void CDigitalMapView::OnFileSave() 
{
	// TODO: Add your command handler code here
	
}

⌨️ 快捷键说明

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