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 + -
显示快捷键?