simplemapview.cpp
来自「evc下ArcInfo操作程序源代码」· C++ 代码 · 共 780 行 · 第 1/2 页
CPP
780 行
m_isDownMouse = 2;
ReleaseCapture();
Dispatch(point);
}
m_isDownMouse = 0;
}
else if ( m_Operation == CMD_ZOOMPAN )
{
if ( m_StartPt.x != point.x || m_StartPt.y == point.y )
{
m_SecondPt = point;
Pan();
}
m_isDownMouse = 0;
ReleaseCapture();
}
CView::OnLButtonUp(nFlags, point);
}
void CSimpleMapView::OnMouseMove(UINT nFlags, CPoint point)
{
double dblX,dblY;
CMapPoint pt;
CPoint pScreen;
CString csStr;
CRect RC;
CSimpleMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
dblX = m_DrawParam.m_StartX + point.x*m_DrawParam.m_Scale;
dblY = m_DrawParam.m_StartY - point.y*m_DrawParam.m_Scale;
pt.SetX(dblX);
pt.SetY(dblY);
CMainFrame *pFrame = (CMainFrame*)AfxGetMainWnd();
if ( m_Operation == CMD_ZOOMIN_WINDOW )
{
//::SetCursor(pFrame->m_hcurZInWindow);
if ( m_isDownMouse == 1 )
Dispatch( point);
}
else if ( m_Operation == CMD_ZOOMOUT )
{
//::SetCursor(pFrame->m_hcurZOut);
}
else if ( m_Operation == CMD_ZOOMPAN )
{
//::SetCursor(pFrame->m_hcurPan);
if ( m_isDownMouse == 1 )
{
if ( point.x != m_StartPt.x || point.y != m_StartPt.y )
{
m_SecondPt = point;
Pan();
m_StartPt = m_SecondPt;
}
}
}
else if ( m_Operation == CMD_ZOOMIN )
{
//::SetCursor(pFrame->m_hcurZIn);
} else if ( m_Operation == CMD_SRHPT )
{
//::SetCursor(pFrame->m_hcurFind);
}
else
{
//::SetCursor(::LoadCursor(NULL,IDC_ARROW));
}
/*
if (pFrame->m_bMapTip ) //鼠标动态提示
{
m_MapTip.InitMapTip(&(pDoc->m_MapLayers));
pScreen = point;
ClientToScreen(&pScreen);
m_MapTip.MoveTo( pt,pScreen);
} */
/*
if (pDoc->m_MapLayers.GetCount() > 0 )
ShowCoordinate(pt); */
CView::OnMouseMove(nFlags, point);
}
void CSimpleMapView::Dispatch(CPoint curPt)
{
int oldDrawMode;
switch( m_Operation )
{
case CMD_ZOOMIN_WINDOW:
{
CPen penDrag( 2 , 1 , RGB(0,0,0) );
CDC *pDC = GetDC();
CPen* pOldPen = (CPen*)pDC->SelectObject( &penDrag );
oldDrawMode = pDC->SetROP2(R2_XORPEN); //设置绘制模式
if ( m_isDownMouse == 1 )
{
pDC->MoveTo(m_StartPt);
pDC->LineTo(m_StartPt.x , m_SecondPt.y);
pDC->LineTo(m_SecondPt.x , m_SecondPt.y);
pDC->LineTo(m_SecondPt.x , m_StartPt.y);
pDC->LineTo(m_StartPt.x , m_StartPt.y);
pDC->MoveTo(m_StartPt);
pDC->LineTo(m_StartPt.x,curPt.y);
pDC->LineTo(curPt.x,curPt.y);
pDC->LineTo(curPt.x,m_StartPt.y);
pDC->LineTo(m_StartPt.x , m_StartPt.y);
}
if ( m_isDownMouse == 2 )
{
pDC->MoveTo(m_StartPt);
pDC->LineTo(m_StartPt.x , m_SecondPt.y);
pDC->LineTo(m_SecondPt.x , m_SecondPt.y);
pDC->LineTo(m_SecondPt.x , m_StartPt.y);
pDC->LineTo(m_StartPt.x , m_StartPt.y);
}
m_SecondPt = curPt;
pDC->SelectObject( pOldPen );
pDC->SetROP2(oldDrawMode);
}
break;
default:
break;
}
}
//显示坐标
void CSimpleMapView::ShowCoordinate( CMapPoint& pt)
{
int iDU,iFEN,iMIAO;
double dblX,dblY;
char szPrompt[100];
CMapRectangle mapExtent;
CMainFrame *pframe;
CSimpleMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//获得当前地图最大矩形范围
pDoc->m_MapLayers.GetAllExtent(mapExtent);
//在地图范围内
if ( mapExtent.IsPointIn(pt) )
{
CString Inf(L"");
pframe =(CMainFrame*)AfxGetMainWnd();
if ( pframe == NULL )
return;
memset(szPrompt , 0 , 100 );
dblX = pt.GetX();
iDU = (int)dblX;
dblX = (dblX-iDU)*60;
iFEN = (int)dblX;
dblX = (dblX-iFEN)*60;
iMIAO = (int)dblX;
sprintf(szPrompt,"东经:%d度%d分%d秒",iDU,iFEN,iMIAO);
//pframe->m_wndStatusBar.SetPaneText(1,szPrompt,true);
Inf+=CString(szPrompt)+L"\r\n";
memset(szPrompt , 0 , 100 );
dblY = pt.GetY();
iDU = (int)dblY;
dblY = (dblY - iDU)*60;
iFEN = (int)dblY;
dblY = (dblY-iFEN)*60;
iMIAO = (int)dblY;
sprintf(szPrompt,"北纬:%d度%d分%d秒",iDU,iFEN,iMIAO);
//pframe->m_wndStatusBar.SetPaneText(2,szPrompt,true);
Inf+=CString(szPrompt);
AfxMessageBox(Inf);
}
}
void CSimpleMapView::ZoomInWindows()
{
double dblX,dblY,dblXScale,dblYScale;
CMapPoint ptFirst,ptSecond;
dblX = m_DrawParam.m_StartX + m_StartPt.x*m_DrawParam.m_Scale;
dblY = m_DrawParam.m_StartY - m_StartPt.y*m_DrawParam.m_Scale;
ptFirst.SetX(dblX);
ptFirst.SetY(dblY);
dblX = m_DrawParam.m_StartX + m_SecondPt.x *m_DrawParam.m_Scale;
dblY = m_DrawParam.m_StartY - m_SecondPt.y*m_DrawParam.m_Scale;
ptSecond.SetX(dblX);
ptSecond.SetY(dblY);
dblXScale = fabs(ptSecond.GetX() - ptFirst.GetX())/m_DrawParam.m_ScreenWidth;
dblYScale = fabs(ptSecond.GetY() - ptFirst.GetY())/m_DrawParam.m_ScreenHeigh;
if ( dblXScale < dblYScale )
m_DrawParam.m_Scale = (float)dblXScale;
else
m_DrawParam.m_Scale = (float)dblYScale;
m_DrawParam.m_StartX = min( ptFirst.GetX(),ptSecond.GetX());
m_DrawParam.m_StartY = max( ptFirst.GetY(),ptSecond.GetY());
Invalidate(TRUE);
}
void CSimpleMapView::ZoomIn()
{
double dblX,dblY;
CMapPoint pt,ptCenter;
//移动鼠标点击点到屏幕中心
dblX = (m_StartPt.x - m_DrawParam.m_ScreenWidth /2)*m_DrawParam.m_Scale;
dblY = (m_StartPt.y - m_DrawParam.m_ScreenHeigh/2) *m_DrawParam.m_Scale;
m_DrawParam.m_StartX += dblX;
m_DrawParam.m_StartY -= dblY;
//计算放大窗口屏幕坐标
m_StartPt.x = m_DrawParam.m_ScreenWidth/2 - m_DrawParam.m_ScreenWidth /(2*m_FixedScale);
m_StartPt.y = m_DrawParam.m_ScreenHeigh/2 - m_DrawParam.m_ScreenHeigh/(2*m_FixedScale);
m_SecondPt.x = m_DrawParam.m_ScreenWidth/2 + m_DrawParam.m_ScreenWidth /(2*m_FixedScale);
m_SecondPt.y = m_DrawParam.m_ScreenHeigh/2 + m_DrawParam.m_ScreenHeigh/(2*m_FixedScale);
ZoomInWindows();
}
void CSimpleMapView::ZoomOut()
{
double dblX,dblY,dblXScale,dblYScale;
CMapPoint pt,ptCenter;
CMapPoint ptFirst,ptSecond;
CMapRectangle mapExtent;
CSimpleMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//获得当前地图最大矩形范围
pDoc->m_MapLayers.GetAllExtent(mapExtent);
dblXScale = m_DrawParam.m_Scale + (mapExtent.GetWidth()/m_FixedScale)/m_DrawParam.m_ScreenWidth;
dblYScale = m_DrawParam.m_Scale + (mapExtent.GetHeigh()/m_FixedScale)/m_DrawParam.m_ScreenHeigh;
if ( dblXScale < dblYScale )
{
m_DrawParam.m_StartX -=(dblXScale - m_DrawParam.m_Scale)*m_DrawParam.m_ScreenWidth/2;
m_DrawParam.m_StartY += (dblXScale - m_DrawParam.m_Scale)*m_DrawParam.m_ScreenHeigh/2;
m_DrawParam.m_Scale = (float)dblXScale;
}
else
{
m_DrawParam.m_StartX -=(dblYScale - m_DrawParam.m_Scale)*m_DrawParam.m_ScreenWidth/2;
m_DrawParam.m_StartY += (dblYScale - m_DrawParam.m_Scale)*m_DrawParam.m_ScreenHeigh/2;
m_DrawParam.m_Scale = (float)dblYScale;
}
//移动鼠标点击点到屏幕中心
dblX = (m_StartPt.x - m_DrawParam.m_ScreenWidth /2)*m_DrawParam.m_Scale;
dblY = (m_StartPt.y - m_DrawParam.m_ScreenHeigh/2) *m_DrawParam.m_Scale;
m_DrawParam.m_StartX += dblX;
m_DrawParam.m_StartY -= dblY;
Invalidate(TRUE);
Invalidate(TRUE);
}
void CSimpleMapView::Pan()
{
double dblX,dblY;
CMapPoint ptFirst,ptSecond;
CRect rc;
dblX = m_DrawParam.m_StartX + m_StartPt.x*m_DrawParam.m_Scale;
dblY = m_DrawParam.m_StartY - m_StartPt.y*m_DrawParam.m_Scale;
ptFirst.SetX(dblX);
ptFirst.SetY(dblY);
dblX = m_DrawParam.m_StartX + m_SecondPt.x *m_DrawParam.m_Scale;
dblY = m_DrawParam.m_StartY - m_SecondPt.y*m_DrawParam.m_Scale;
ptSecond.SetX(dblX);
ptSecond.SetY(dblY);
m_DrawParam.m_StartX -= ptSecond.GetX() - ptFirst.GetX();
m_DrawParam.m_StartY -= ptSecond.GetY() - ptFirst.GetY();
rc.left = (long)min(ptSecond.GetX(),ptFirst.GetX());
rc.right = (long)max(ptSecond.GetX(),ptFirst.GetX());
rc.top = (long)min(ptSecond.GetY(),ptFirst.GetY());
rc.bottom = (long)max(ptSecond.GetY(),ptFirst.GetY());
Invalidate(TRUE);
}
void CSimpleMapView::PtSelected(CPoint& pt)
{
short i;
int iIndex;
double dblX,dblY;
CMapPoint MapPt;
CMapLayer *pLayer;
CSimpleMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC *pDC = GetDC();
dblX = m_DrawParam.m_StartX + pt.x*m_DrawParam.m_Scale;
dblY = m_DrawParam.m_StartY - pt.y*m_DrawParam.m_Scale;
MapPt.SetX(dblX);
MapPt.SetY(dblY);
for ( i = 0 ; i < pDoc->m_MapLayers.GetCount() ; i++ )
{
pLayer = (CMapLayer*)pDoc->m_MapLayers.GetAt(i);
iIndex = pLayer->SearchShape(MapPt);
if ( iIndex > 0 )
{
pLayer->FlashShp(pDC,m_DrawParam,iIndex);
break;
}
}
}
void CSimpleMapView::OnUpdateMapNothing(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_Operation == CMD_NOTHING);
}
void CSimpleMapView::OnUpdateMapPan(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_Operation == CMD_ZOOMPAN);
}
void CSimpleMapView::OnUpdateMapZoomIn(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_Operation == CMD_ZOOMIN);
}
void CSimpleMapView::OnUpdateMapZoomOut(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_Operation == CMD_ZOOMOUT);
}
void CSimpleMapView::OnUpdateMapZoomWindow(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_Operation == CMD_ZOOMIN_WINDOW);
}
void CSimpleMapView::OnMapSrhpt()
{
m_Operation = CMD_SRHPT;
}
void CSimpleMapView::OnUpdateMapSrhpt(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_Operation == CMD_SRHPT);
}
void CSimpleMapView::OnLayerManage()
{
CLayerManageDlg Dialog1;
Dialog1.DoModal();
}
void CSimpleMapView::OnMapCoord()
{
m_Operation=CMD_COORD;
}
void CSimpleMapView::OnUpdateMapCoord(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_Operation == CMD_COORD);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?