📄 mygeomapview.cpp
字号:
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 + -