simplemapview.cpp

来自「evc下ArcInfo操作程序源代码」· C++ 代码 · 共 780 行 · 第 1/2 页

CPP
780
字号
// SimpleMapView.cpp : implementation of the CSimpleMapView class
//

#include "stdafx.h"
#include "SimpleMap.h"

#include "SimpleMapDoc.h"
#include "SimpleMapView.h"

#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSimpleMapView

IMPLEMENT_DYNCREATE(CSimpleMapView, CView)

BEGIN_MESSAGE_MAP(CSimpleMapView, CView)
	//{{AFX_MSG_MAP(CSimpleMapView)
	ON_WM_SIZE()
	ON_COMMAND(ID_MAP_NOTHING, OnMapNothing)
	ON_COMMAND(ID_MAP_ZOOM_IN, OnMapZoomIn)
	ON_COMMAND(ID_MAP_ZOOM_OUT, OnMapZoomOut)
	ON_COMMAND(ID_MAP_ZOOM_ALL, OnMapZoomAll)
	ON_COMMAND(ID_MAP_PAN, OnMapPan)
	ON_COMMAND(ID_MAP_ZOOM_WINDOW, OnMapZoomWindow)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_UPDATE_COMMAND_UI(ID_MAP_NOTHING, OnUpdateMapNothing)
	ON_UPDATE_COMMAND_UI(ID_MAP_PAN, OnUpdateMapPan)
	ON_UPDATE_COMMAND_UI(ID_MAP_ZOOM_IN, OnUpdateMapZoomIn)
	ON_UPDATE_COMMAND_UI(ID_MAP_ZOOM_OUT, OnUpdateMapZoomOut)
	ON_UPDATE_COMMAND_UI(ID_MAP_ZOOM_WINDOW, OnUpdateMapZoomWindow)
	ON_COMMAND(ID_MAP_SRHPT, OnMapSrhpt)
	ON_UPDATE_COMMAND_UI(ID_MAP_SRHPT, OnUpdateMapSrhpt)
	ON_COMMAND(ID_LAYER_MANAGE, OnLayerManage)
	ON_COMMAND(ID_MAP_COORD, OnMapCoord)
	ON_UPDATE_COMMAND_UI(ID_MAP_COORD, OnUpdateMapCoord)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSimpleMapView construction/destruction

CSimpleMapView::CSimpleMapView()
{
	m_Operation = CMD_NOTHING;              
	m_isDownMouse = 0;             
	m_StartPt.x = 0 ;
	m_StartPt.y = 0 ;
	m_SecondPt.x = 0;
    m_SecondPt.y = 0; 
}

CSimpleMapView::~CSimpleMapView()
{
}

BOOL CSimpleMapView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSimpleMapView drawing

void CSimpleMapView::OnDraw(CDC* pDC)
{
	CSimpleMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
	CMapLayer *pLayer;
	CRect rc;
	CBitmap bmp; 
	CDC dcMemory;
	
	//BeginWaitCursor(); 
	GetClientRect(rc); 
	//dcMemory.CreateCompatibleDC(pDC);
	//bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());   
	//dcMemory.SelectObject(&bmp); 
	short iCount = pDoc->m_MapLayers.GetCount(); 
	for ( short i = 0 ; i < iCount ; i++ )
	{ 
		pLayer = pDoc->m_MapLayers.GetAt(i);
		pLayer->DrawLayer(pDC , m_DrawParam ); 
		
	} 
	//pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMemory,0,0,SRCCOPY); 
	//dcMemory.DeleteDC(); 
	//bmp.DeleteObject(); 
	//pDC->SetMapMode(MM_TEXT);          //设置映射模式
	//EndWaitCursor(); 
}

/////////////////////////////////////////////////////////////////////////////
// CSimpleMapView diagnostics

#ifdef _DEBUG
void CSimpleMapView::AssertValid() const
{
	CView::AssertValid();
}

void CSimpleMapView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CSimpleMapDoc* CSimpleMapView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSimpleMapDoc)));
	return (CSimpleMapDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSimpleMapView message handlers

void CSimpleMapView::InitScale()
{

	float fxScale,fyScale;
	double dbTmp;
	CRect rc;
	CMapRectangle mapExtent;

	CSimpleMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
	//获得当前地图最大矩形范围
	pDoc->m_MapLayers.GetAllExtent(mapExtent);  
	//获得视图客户区矩形范围
	GetClientRect(&rc);
	m_DrawParam.m_ScreenWidth = abs(rc.right - rc.left);
    m_DrawParam.m_ScreenHeigh = abs(rc.bottom  - rc.top); 
    //计算横向比例系数

	fxScale = (float)(fabs(mapExtent.GetRight()-mapExtent.GetLeft())/
		              m_DrawParam.m_ScreenWidth);
	//计算纵向比例系数
	fyScale = (float)(fabs(mapExtent.GetBottom() -mapExtent.GetTop() )/
		              m_DrawParam.m_ScreenHeigh);
	//选择较大的做比例尺
	if ( fxScale > fyScale)
    {  
       m_DrawParam.m_Scale =  fxScale;
	   m_DrawParam.m_StartX = mapExtent.GetLeft();
       dbTmp = fabs(mapExtent.GetBottom() -mapExtent.GetTop());
	   dbTmp =fxScale*m_DrawParam.m_ScreenHeigh - dbTmp;  
       m_DrawParam.m_StartY = mapExtent.GetBottom() -  dbTmp / 2; 
    } 
	else
    {   
	   m_DrawParam.m_Scale =  fyScale;
	   m_DrawParam.m_StartY =  mapExtent.GetBottom(); 
       dbTmp = fabs(mapExtent.GetRight() -mapExtent.GetLeft()); 
	   dbTmp = fyScale*m_DrawParam.m_ScreenWidth - dbTmp;  
       m_DrawParam.m_StartX =  mapExtent.GetLeft() - dbTmp / 2; 
    } 

	Invalidate(TRUE);

}

void CSimpleMapView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	CRect rc;
	GetClientRect(&rc); 
	m_DrawParam.m_Scale = 1;
	m_DrawParam.m_StartX = 10;
    m_DrawParam.m_StartY = 10;
    m_DrawParam.m_ScreenWidth = abs(rc.right  - rc.left);
	m_DrawParam.m_ScreenHeigh = abs(rc.bottom - rc.top );

	m_FixedScale = 2;
	
}

void CSimpleMapView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	float fxScale,fyScale;
	double dbTmp;
	CRect rc;
	CMapRectangle mapExtent;

	CSimpleMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
	//获得当前地图最大矩形范围
	pDoc->m_MapLayers.GetAllExtent(mapExtent);  
	//获得视图客户区矩形范围
	GetClientRect(&rc);
	m_DrawParam.m_ScreenWidth = abs(rc.right - rc.left);
    m_DrawParam.m_ScreenHeigh = abs(rc.bottom  - rc.top); 
    //计算横向比例系数

	fxScale = (float)(fabs(mapExtent.GetRight()-mapExtent.GetLeft())/
		              m_DrawParam.m_ScreenWidth);
	//计算纵向比例系数
	fyScale = (float)(fabs(mapExtent.GetBottom() -mapExtent.GetTop() )/
		              m_DrawParam.m_ScreenHeigh);
	//选择较大的做比例尺
	if ( fxScale > fyScale)
    {  
        m_DrawParam.m_Scale =  fxScale;
	    m_DrawParam.m_StartX = mapExtent.GetLeft();
        dbTmp = fabs(mapExtent.GetBottom() -mapExtent.GetTop());
	    dbTmp =fxScale*m_DrawParam.m_ScreenHeigh - dbTmp;  
        m_DrawParam.m_StartY = mapExtent.GetBottom() -  dbTmp / 2; 
    } 
	else
    {   
	   m_DrawParam.m_Scale =  fyScale;
	   m_DrawParam.m_StartY =  mapExtent.GetBottom(); 
       dbTmp = fabs(mapExtent.GetRight() -mapExtent.GetLeft()); 
	   dbTmp = fyScale*m_DrawParam.m_ScreenWidth - dbTmp;  
       m_DrawParam.m_StartX =  mapExtent.GetLeft() - dbTmp / 2; 
    } 
	Invalidate(TRUE); 
	
}

void CSimpleMapView::OnMapNothing() 
{
	m_Operation = 0;
}

void CSimpleMapView::OnMapZoomIn() 
{
	m_Operation =  CMD_ZOOMIN;  
}

void CSimpleMapView::OnMapZoomOut() 
{
	m_Operation =  CMD_ZOOMOUT;  
}

void CSimpleMapView::OnMapZoomAll() 
{
	float fxScale,fyScale;
	double dbTmp;
	CRect rc;
	CMapRectangle mapExtent;

	CSimpleMapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
	//获得当前地图最大矩形范围
	pDoc->m_MapLayers.GetAllExtent(mapExtent);  
	//获得视图客户区矩形范围
	GetClientRect(&rc);
	m_DrawParam.m_ScreenWidth = abs(rc.right - rc.left);
    m_DrawParam.m_ScreenHeigh = abs(rc.bottom  - rc.top); 
    //计算横向比例系数

	fxScale = (float)(fabs(mapExtent.GetRight()-mapExtent.GetLeft())/
		              m_DrawParam.m_ScreenWidth);
	//计算纵向比例系数
	fyScale = (float)(fabs(mapExtent.GetBottom() -mapExtent.GetTop() )/
		              m_DrawParam.m_ScreenHeigh);
	//选择较大的做比例尺
	if ( fxScale > fyScale)
    {  
       m_DrawParam.m_Scale =  fxScale;
	   m_DrawParam.m_StartX = mapExtent.GetLeft();
       dbTmp = fabs(mapExtent.GetBottom() -mapExtent.GetTop());
	   dbTmp =fxScale*m_DrawParam.m_ScreenHeigh - dbTmp;  
       m_DrawParam.m_StartY = mapExtent.GetBottom() -  dbTmp / 2; 
    } 
	else
    {   
	   m_DrawParam.m_Scale =  fyScale;
	   m_DrawParam.m_StartY =  mapExtent.GetBottom(); 
       dbTmp = fabs(mapExtent.GetRight() -mapExtent.GetLeft()); 
	   dbTmp = fyScale*m_DrawParam.m_ScreenWidth - dbTmp;  
       m_DrawParam.m_StartX =  mapExtent.GetLeft() - dbTmp / 2; 
    } 
	pDoc->UpdateAllViews(NULL); 
	
}

void CSimpleMapView::OnMapPan() 
{
	m_Operation = CMD_ZOOMPAN;
}

void CSimpleMapView::OnMapZoomWindow() 
{
	m_Operation = CMD_ZOOMIN_WINDOW;
}

void CSimpleMapView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CRect rc;
	GetClientRect(&rc); 
	
	if ( m_Operation == CMD_ZOOMIN_WINDOW && rc.PtInRect(point))
    {    
		
		m_StartPt = point;
		m_SecondPt = point;
		m_isDownMouse = 1;
		//保证鼠标移动到窗体外也可以接收到鼠标释放时件
		SetCapture(); 
		Dispatch( point);
		
    } 

    if ( m_Operation == CMD_ZOOMIN && rc.PtInRect(point))
    {
		 //点击放大
		m_StartPt = point;
		m_SecondPt = point;
		ZoomIn();
		

    }  
	if (m_Operation == CMD_ZOOMOUT && rc.PtInRect(point))
    {
		m_StartPt = point;
		m_SecondPt = point;
		m_isDownMouse = 1;
		ZoomOut(); 
			
    } 
	
	if (m_Operation == CMD_ZOOMPAN  && rc.PtInRect(point))
    {
		m_StartPt = point;
		m_SecondPt = point;
		m_isDownMouse = 1;
		//保证鼠标移动到窗体外也可以接收到鼠标释放时件
		SetCapture(); 
		
    }   
	if (m_Operation == CMD_SRHPT  && rc.PtInRect(point))
    {
		PtSelected(point);

    } 
	if(m_Operation == CMD_COORD  && rc.PtInRect(point))
	{
		CMapPoint pt;
		double dblX,dblY;
		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);
		ShowCoordinate(pt);
	}
	
	CView::OnLButtonDown(nFlags, point);
}

void CSimpleMapView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if ( m_Operation == CMD_ZOOMIN_WINDOW )
    {   
	    if ( m_isDownMouse == 1 ) //一次有效的拖动
        {  
			m_isDownMouse = 2;
			m_SecondPt = point;
			ReleaseCapture();
			Dispatch(point);
			if ( m_StartPt.x != m_SecondPt.x || m_StartPt.y != m_SecondPt.y ) 
				ZoomInWindows();
        }
        m_isDownMouse = 0; 
	
		
    } 
	else if ( m_Operation == CMD_ZOOMOUT )
    {
	    if ( m_isDownMouse == 1 ) //一次有效的拖动
        {  

⌨️ 快捷键说明

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