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