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

📄 mygeomapview.cpp

📁 MFC 空间数据的表达与操作
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				else if (a<0) 
				{
					m_zooom*=-rect.Height()*1.0/a;
				}
				
			}
			else
			{
				if (b>0) 
				{
					m_zooom*=rect.Height()*1.0/b;
				}
				else if (b<0) 
				{
					m_zooom*=-rect.Height()*1.0/b;
				}
			}
			DrawLayer(m_zooom);
			Invalidate();
		}
		break;
	case 11:
		SelectTool=1;
		pointend=point;
		DrawLine(FALSE);
		a=point.x-pointstart.x;
		b=point.y-pointstart.y;
		if ((a<3&&a>-3)||(b<3&&b>-3)) 
		{
			mapcenterx+=(point.x-rect.Width()/2)/m_zooom;
			mapcentery-=(point.y-rect.Height()/2)/m_zooom;
			m_zooom=m_zooom/1.3;
			DrawLayer(m_zooom);
			Invalidate();
		}
		else
		{
			mapcenterx+=((point.x+pointstart.x)/2-rect.Width()/2)/m_zooom;
			mapcentery-=((point.y+pointstart.y)/2-rect.Height()/2)/m_zooom;
			if (a*a*1.0/(rect.Width()*rect.Width())<1.0*b*b/(rect.Height()*rect.Height())) 
			{
				if (a>0) 
				{
					m_zooom/=rect.Height()*1.0/a;
				}
				else if (a<0) 
				{
					m_zooom/=-rect.Height()*1.0/a;
				}
				
			}
			else
			{
				if (b>0) 
				{
					m_zooom/=rect.Height()*1.0/b;
				}
				else if (b<0) 
				{
					m_zooom/=-rect.Height()*1.0/b;
				}
			}
			DrawLayer(m_zooom);
			Invalidate();
		}
		break;
	case 2:
		break;
	case 3:
		::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR2));
		mapcenterx+=(pointstart.x-point.x)/m_zooom;
		mapcentery-=(pointstart.y-point.y)/m_zooom;
		DrawLayer(m_zooom);
		SelectTool=2;
		Bitmapx=Bitmapy=0;
		Invalidate();
		break;
	}
	CView::OnLButtonUp(nFlags, point);
}

void CMyGeoMapView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	double x,y;
	if (DataBaseName!="") 
	{
		switch(SelectTool) {
		case 10:
		case 11:
			DrawLine(true);//Erase first line
			pointend=point;     
			DrawLine(true); //Stretch it
			break;
		case 2:
			
			break;
		case 3:	
			CDC *pDC=GetDC();
			CBrush brush;
			brush.CreateSolidBrush(RGB(255,255,255));
			Bitmapx=pointstart.x-point.x;
			Bitmapy=pointstart.y-point.y;
			
			CRgn r1,r2;
			CRect rc;
			rc=CRect(-Bitmapx,-Bitmapy,-Bitmapx+rect.Width(),
				-Bitmapy+rect.Height());
			
			r1.CreateRectRgnIndirect(rect);
			r2.CreateRectRgnIndirect(rc);
			r1.CombineRgn(&r1,&r2,RGN_DIFF);
			pDC->FillRgn(&r1,&brush);
			pDC->BitBlt(0,0,rect.Width(),rect.Height(),
				m_pMemDC,Bitmapx,Bitmapy,SRCCOPY);
			break;
		}
		ScreenToMap(point,&x,&y);
		((CMainFrame *)AfxGetMainWnd())->ShowCoordinate(x,y);
	}
	CView::OnMouseMove(nFlags, point);
}

void CMyGeoMapView::OnFullsize() 
{
	// TODO: Add your command handler code here
	if (DataBaseName!="") 
	{
		GetCenterPoint();
		DrawLayer(m_zooom);
		SelectTool=-1;
		Invalidate();
	}
	
}

void CMyGeoMapView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	GetClientRect(&rect);
	CClientDC pDC(this);
	if (m_pMemBitmap!=NULL&&m_pMemDC!=NULL) 
	{
		m_pMemDC->DeleteDC();
		m_pMemBitmap->DeleteObject();
		m_pMemDC->CreateCompatibleDC(&pDC);
		m_pMemBitmap->CreateCompatibleBitmap(&pDC,rect.Width()-1,rect.Height()-1);	
		m_pMemDC->SelectObject(m_pMemBitmap);
		ClearMemScreen(m_pMemDC);
	}
	else
	{
		m_pMemDC->CreateCompatibleDC(&pDC);
		m_pMemBitmap->CreateCompatibleBitmap(&pDC,rect.Width()-1,rect.Height()-1);	
		m_pMemDC->SelectObject(m_pMemBitmap);
		ClearMemScreen(m_pMemDC);
	}
	
}
void CMyGeoMapView::ClearMemScreen(CDC *pDC)
{
	CPen * hnewPen;
	CBrush * hnewBrush;
	CPen * pPrePen;
	CBrush * pPreBrush;
    
	hnewPen=new CPen(PS_SOLID,1,RGB(25,25,25)); 
	hnewBrush=new CBrush(RGB(255,255,255));
	if(pPrePen=pDC->SelectObject(hnewPen))
		if(pPreBrush=pDC->SelectObject(hnewBrush))
			pDC->Rectangle(-1,-1,rect.Width(),rect.Height());
		pDC->SelectObject(pPreBrush);
		pDC->SelectObject(pPrePen);
		delete hnewBrush;
		delete hnewPen;
}

BOOL CMyGeoMapView::IfViewChange(CRect rect1)
{
	if (rect!=rect1) 
	{
		CBitmap *pOldBitmap;
		CBrush pBrushNew;
		rect=rect1;
		m_pMemBitmap->DeleteObject();
		CClientDC pDC(this);
		m_pMemBitmap->CreateCompatibleBitmap(&pDC,rect.Width()-1,rect.Height()-1);
		m_pMemDC->SelectObject(m_pMemBitmap);
		pBrushNew.CreateSolidBrush(RGB(255,255,255));
		pOldBitmap=m_pMemDC->SelectObject(m_pMemBitmap);
		m_pMemDC->FillRect(rect,&pBrushNew);
		pBrushNew.DeleteObject();
		DrawLayer(m_zooom);
		return TRUE;
	}
	else
		return FALSE;
}

void CMyGeoMapView::OnMove() 
{
	// TODO: Add your command handler code here
	if (DataBaseName!="") 
	{
		SelectTool=2;
		UpdateData(false);
	}	
}

void CMyGeoMapView::SetCenterPoint(double centerx, double centery)
{
	mapcenterx=centerx;
	mapcentery=centery;
	DrawLayer(m_zooom);
	Invalidate();
}

void CMyGeoMapView::ScreenToMap(CPoint point, double *x, double *y)
{
	*x=(point.x-rect.Width()/2)/m_zooom+mapcenterx;
	*y=mapcentery-(point.y-rect.Height()/2)/m_zooom;
}

void CMyGeoMapView::OnRedo() 
{
	// TODO: Add your command handler code here
	SelectTool=-1;
}

void CMyGeoMapView::DrawSelectObject(CString ObjectName, double *point,int pointnuber)
{
	double midx,midy;
	midy=midx=0.0;
	int a;
	for(a=0;a<pointnuber;a++)
	{
		midx+=point[2*a]/pointnuber;
		midy+=point[2*a+1]/pointnuber;
	}
	mapcenterx=midx;
	mapcentery=midy;
	delete []pointselect;
	pointselect=new double[pointnuber*2];
		for(int i=0;i<pointnuber*2;i++)
			pointselect[i]=point[i];
	SelectName=ObjectName;
	SelectPointNumber=pointnuber;
	DrawLayer(m_zooom);
	UpdateData(false);
	Invalidate();
}

BOOL CMyGeoMapView::DrawCurrentObject(CPoint point)
{
	double pointy,pointx,diatance=0;
	int i;
	BOOL check;
	check=false;
	ScreenToMap(point,&pointx,&pointy);
	
	if (pointx<=mapcenterxMax&&pointx>=mapcenterxMin&&pointy>=mapcenteryMin&&pointy<=mapcenteryMax) 
	{
		_RecordsetPtr m_pRecordsetTemp;
		m_pRecordsetTemp.CreateInstance("ADODB.Recordset");
		for(i=Layers->m_layernumber-1;i>=0;i--)
		{
			if (Layers->layerinfo[i].Visible)
			{
				_variant_t temp;
				double *doustemp;
				CPoint *pointtemp;
				CString SQl;
				SQl.Format("SELECT * FROM %s ",Layers->layerinfo[i].layername);
				m_pRecordsetTemp->Open((_variant_t)SQl,_variant_t(m_pConnection,true)
					,adOpenStatic,adLockOptimistic,adCmdText);
				
				m_pRecordsetTemp->MoveLast();
				while (!m_pRecordsetTemp->BOF) 
				{
					long nLength=m_pRecordsetTemp->Fields->GetItem("Corser")->ActualSize;
					temp=m_pRecordsetTemp->GetFields()->GetItem("CorSer")->GetChunk(nLength);
					double *pBuf = NULL;
					doustemp=new double[nLength/8];
					pointtemp =new CPoint[nLength/16];
					SafeArrayAccessData(temp.parray,(void**)&pBuf);
					memcpy(doustemp,pBuf,nLength);
					SafeArrayUnaccessData (temp.parray);
					for(int a=0;a<nLength/16;a++)
					{
						pointtemp[a]=MapToScreen(mapcenterx,mapcentery,doustemp[2*a],doustemp[2*a+1],m_zooom);
					}
					///////////////////////////////////////////////////
					if (Layers->layerinfo[i].layername=="Area") 
					{
						CRgn rgntemp;
						rgntemp.CreatePolygonRgn(pointtemp,nLength/16,ALTERNATE);
						if (rgntemp.PtInRegion(point)) 
						{
							Layers->m_tablename=SelectName=Layers->layerinfo[i].layername;
							SelectPointNumber=nLength/16;
							delete [] pointselect;
							pointselect=new double[nLength/8];
							for(int j=0;j<nLength/8;j++)
								pointselect[j]=doustemp[j];
							i=Layers->m_layernumber;
							Layers->UpdateData(false);
							CString info;
							info.Format("Layer:%s ID=%d ObjectID=%d AreaID=%d",Layers->m_tablename,
								(m_pRecordsetTemp->GetCollect("ID")).lVal,
								(m_pRecordsetTemp->GetCollect("ObjectID")).lVal,
								(m_pRecordsetTemp->GetCollect("AreaID")).lVal);
							((CMainFrame *)AfxGetMainWnd())->ShowObjectInfo(info);
							Invalidate();
							delete []pointtemp;
							delete []doustemp;
							return true;
						}
					}
					/////////////////////////////////////////////////////////////////
					else if (Layers->layerinfo[i].layername=="Line") 
					{
						CPoint point1,point2,point3,point4;
						point1=point2=point3=point4=pointtemp[0];
						CRect rectpoint;
						for(int n=1;n<nLength/16;n++)
						{
							point3.x=min(point3.x,pointtemp[n].x);
							point3.y=min(point3.y,pointtemp[n].y);
							point4.x=max(point4.x,pointtemp[n].x);
							point4.y=max(point4.y,pointtemp[n].y);
						}

						rectpoint=CRect(point3.x-2,point3.y-2,point4.x+2,point4.y+2);

						if (rectpoint.PtInRect(point)) 
						{
							point1=pointtemp[0];
							for(int m=1;m<nLength/16;m++)
							{
								
								point2=pointtemp[m];
								point3.x=min(pointtemp[m-1].x,pointtemp[m].x);
								point3.y=min(pointtemp[m-1].y,pointtemp[m].y);
								point4.x=max(pointtemp[m-1].x,pointtemp[m].x);
								point4.y=max(pointtemp[m-1].y,pointtemp[m].y);
								rectpoint=CRect(point3.x-2,point3.y-2,point4.x+2,point4.y+2);

								
								if (rectpoint.PtInRect(point))
								{
									diatance=GetTwoPointDiatance(point,point1,point2);
									if (diatance<=2) 
									{
										Layers->m_tablename=SelectName=Layers->layerinfo[i].layername;
										SelectPointNumber=nLength/16;
										delete [] pointselect;
										pointselect=new double[nLength/8];
										for(int j=0;j<nLength/8;j++)
											pointselect[j]=doustemp[j];
										i=Layers->m_layernumber;
										Layers->UpdateData(false);

										CString info;
										info.Format("Layer:%s ID=%d ObjectID=%d LineID=%d",Layers->m_tablename,
											(m_pRecordsetTemp->GetCollect("ID")).lVal,
											(m_pRecordsetTemp->GetCollect("ObjectID")).lVal,
											(m_pRecordsetTemp->GetCollect("LineID")).lVal);
										((CMainFrame *)AfxGetMainWnd())->ShowObjectInfo(info);
										
										Invalidate();
										
										delete []pointtemp;
										delete []doustemp;
										return true;
									}
								}
								point1=point2;
							}	
						}
					}
					else
					{
						Layers->m_tablename="";
						Layers->UpdateData(false);
					}
					m_pRecordsetTemp->MovePrevious();
					delete []pointtemp;
					delete []doustemp;
			}
			m_pRecordsetTemp->Close();
			}
		
		}
		return true;
	}
	else 
	return false;
}

void CMyGeoMapView::DrawSelect(CDC *pDC, int SelectObjectNumber, CString ObjectName)
{
	if (SelectPointNumber!=0&&SelectName!="") 
	{	
		CPen  *pPenOld, PenNew;
		CBrush *pBrushOld,pBrushNew;
		CPoint *pointtemp;
		pointtemp=new CPoint[SelectPointNumber];
		for(int a=0;a<SelectPointNumber;a++)
		{
			pointtemp[a]=MapToScreen(mapcenterx,mapcentery,pointselect[2*a],pointselect[2*a+1],m_zooom);
		}
		if (SelectName=="Line"&&PenNew.CreatePen(BS_SOLID,4,RGB(0,255,0)))
		{
			pPenOld=pDC->SelectObject(&PenNew);
			pDC->Polyline(pointtemp,SelectPointNumber);
			pDC->SelectObject(pPenOld);
			PenNew.DeleteObject();
		}
		else if (SelectName=="Area"&&PenNew.CreatePen(BS_SOLID,1,RGB(255,0,0))) 
		{
			pDC->SetROP2(R2_NOTXORPEN);
			pBrushNew.CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,0));
			pPenOld=pDC->SelectObject(&PenNew);
			pBrushOld=pDC->SelectObject(&pBrushNew);
			
			pDC->Polygon(pointtemp,SelectPointNumber);
			
			pDC->SelectObject(pPenOld);
			pDC->SelectObject(pBrushOld);
			pBrushNew.DeleteObject();
			PenNew.DeleteObject();
		}
		delete []pointtemp;
	}
}

void CMyGeoMapView::DrawLine(BOOL check)
{
	CClientDC dc(this);
	if (check)
	{
		dc.SetROP2(R2_NOT);
	}	   
	//Draw the appropriate shape
	dc.MoveTo(pointstart);
	dc.LineTo(pointstart.x,pointend.y);
	dc.LineTo(pointend);
	dc.LineTo(pointend.x,pointstart.y);
	dc.LineTo(pointstart);
}

double CMyGeoMapView::GetTwoPointDiatance(CPoint point, CPoint point1, CPoint point2)
{
	double abc,ab;
	if ((point2.y-point1.y)==0) 
	{	
		return max((point.y-point1.y),-(point.y-point1.y));
	}
	else if ((point2.x-point1.x)==0) 
	{
		return max((point.x-point1.x),-(point.x-point1.x));
	}
	abc=(point2.y-point1.y)*(point.x-point1.x)*1.0-(point2.x-point1.x)*(point.y-point1.y)*1.0;
	if (abc<0) 
	{
		abc=-abc;
	}
	ab=sqrt((point2.y-point1.y)*(point2.y-point1.y)*1.0+(point2.x-point1.x)*1.0*(point2.x-point1.x));
	if (ab!=0) 
	{
		return abc/ab*1.0;
	}	
}

⌨️ 快捷键说明

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