www.pudn.com > 我用vc做的鹰眼图.rar > EagleMapView.cpp


// EagleMapView.cpp : implementation of the CEagleMapView class 
// 
 
#include "stdafx.h" 
#include "EagleMap.h" 
 
#include "EagleMapDoc.h" 
#include "EagleMapView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define IDC_MAP 100 
#define IDC_MAP2 101 
#define MYTOOL_SYMBOL 1 
#define MYTOOL_LINE 2 
#define MYTOOL_REGION 3 
#define MYTOOL_TEXT 4 
#define CUST_INFO 5 
//#define MYTOOL_REGION 6 
 
//#define IDC_MAP2 101 
 
///////////////////////////////////////////////////////////////////////////// 
// CEagleMapView 
 
IMPLEMENT_DYNCREATE(CEagleMapView, CView) 
 
BEGIN_MESSAGE_MAP(CEagleMapView, CView) 
	//{{AFX_MSG_MAP(CEagleMapView) 
	ON_WM_CREATE() 
	ON_WM_SIZE() 
	ON_COMMAND(ID_MAP_TOOL_ZOOMOUT, OnMapToolZoomout) 
	ON_COMMAND(ID_MAP_TOOL_ZOOMIN, OnMapToolZoomin) 
	ON_COMMAND(ID_MAP_TOOL_PAN, OnMapToolPan) 
	ON_COMMAND(ID_INFO_TOOL, OnInfoTool) 
	ON_COMMAND(ID_VIEW_LAYERCONTROL, OnViewLayercontrol) 
	ON_WM_SETFOCUS() 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
BEGIN_EVENTSINK_MAP(CEagleMapView, CView) 
//	ON_EVENT(CMapTestView, IDC_MAP, DISPID_CLICK, OnClick_Map, VTS_NONE) 
//	ON_EVENT(CMapTestView, IDC_MAP, DISPID_DBLCLICK, OnDblClick_Map, VTS_NONE) 
//	ON_EVENT(CMapTestView, IDC_MAP, DISPID_ERROREVENT, OnError_Map, VTS_I2 VTS_PBSTR VTS_I4 VTS_BSTR VTS_BSTR VTS_I4 VTS_PBOOL) 
//	ON_EVENT(CMapTestView, IDC_MAP, DISPID_KEYDOWN, OnKeyDown_Map, VTS_PI2 VTS_I2) 
//	ON_EVENT(CMapTestView, IDC_MAP, DISPID_KEYPRESS, OnKeyPress_Map, VTS_PI2) 
//	ON_EVENT(CMapTestView, IDC_MAP, DISPID_KEYUP, OnKeyUp_Map, VTS_PI2 VTS_I2) 
    //ON_EVENT(CEagleMapView, IDC_MAP, DISPID_MOUSEDOWN, OnMouseDownMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4) 
ON_EVENT(CEagleMapView, IDC_MAP2, -605 /* MouseDown */, OnMouseDownMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4) 
ON_EVENT(CEagleMapView, IDC_MAP2, DISPID_MOUSEUP, OnMouseUpInMap, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS) 
ON_EVENT(CEagleMapView, IDC_MAP2, DISPID_MOUSEMOVE, OnMouseMoveInMap, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS) 
 
 
//	ON_EVENT(CMapTestView, IDC_MAP, MAPX_DISPID_SELECTION_CHANGED, OnSelectionChanged, VTS_NONE) 
//	ON_EVENT(CMapTestView, IDC_MAP, MAPX_DISPID_RESOLVEDATABIND, OnResolveDataBind, VTS_I2 VTS_I2 VTS_VARIANT VTS_PI2 VTS_PBOOL) 
//	ON_EVENT(CMapTestView, IDC_MAP, MAPX_DISPID_REQUESTDATA, OnRequestData, VTS_BSTR VTS_I4 VTS_I2 VTS_PVARIANT VTS_PBOOL) 
//	ON_EVENT(CMapTestView, IDC_MAP, MAPX_DISPID_DATAMISMATCH, OnDataMismatch, VTS_BSTR VTS_I4 VTS_PBSTR) 
    ON_EVENT(CEagleMapView, IDC_MAP, MAPX_DISPID_MAPVIEWCHANGED, OnMapViewChanged, VTS_NONE) 
 
//	ON_EVENT(CMapTestView, IDC_MAP, MAPX_DISPID_ANNOTATIONADDED, OnAnnotationAdded, VTS_DISPATCH) 
//	ON_EVENT(CMapTestView, IDC_MAP, MAPX_DISPID_ANNOTATIONCHANGED, OnAnnotationChanged, VTS_I2 VTS_DISPATCH VTS_PBOOL) 
//  ON_EVENT(CEagleMapView, IDC_MAP, MAPX_DISPID_THEMEMODIFYREQUESTED, OnThemeModifyRequested, VTS_DISPATCH) 
//	ON_EVENT(CMapTestView, IDC_MAP, MAPX_DISPID_DRAWUSERLAYER, OnDrawUserLayer, VTS_DISPATCH VTS_I4 VTS_I4 VTS_DISPATCH VTS_DISPATCH) 
//	ON_EVENT(CMapTestView, IDC_MAP, MAPX_DISPID_POLYTOOLUSED, OnPolyToolUsed, VTS_I2 VTS_I4 VTS_DISPATCH VTS_BOOL VTS_BOOL VTS_PBOOL) 
//  ON_EVENT(CEagleMapView, IDC_MAP1, MAPX_DISPID_TOOLUSED, OnToolUsed, VTS_I2 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_BOOL VTS_BOOL VTS_PBOOL) 
//	ON_EVENT(CMapTestView, IDC_MAP, MAPX_DISPID_MOUSEWHEEL, OnMouseWheel, VTS_I4 VTS_I2 VTS_PR4 VTS_PR4 VTS_PBOOL) 
//	ON_EVENT(CMapTestView, IDC_MAP, MAPX_DISPID_MAPINITIALIZED, OnMapInitialized, VTS_NONE)	 
END_EVENTSINK_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CEagleMapView construction/destruction 
 
CEagleMapView::CEagleMapView() 
{ 
	// TODO: add construction code here 
    bDown=0; 
} 
 
CEagleMapView::~CEagleMapView() 
{ 
} 
 
BOOL CEagleMapView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CEagleMapView drawing 
 
void CEagleMapView::OnDraw(CDC* pDC) 
{ 
	CEagleMapDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CEagleMapView printing 
 
BOOL CEagleMapView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CEagleMapView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CEagleMapView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CEagleMapView diagnostics 
 
#ifdef _DEBUG 
void CEagleMapView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CEagleMapView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CEagleMapDoc* CEagleMapView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEagleMapDoc))); 
	return (CEagleMapDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CEagleMapView message handlers 
 
int CEagleMapView::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	 
	if (CView::OnCreate(lpCreateStruct) == -1) 
		return -1;	 
	// TODO: Add your specialized creation code here 
	if (!m_eaglaeMapX.Create(NULL, WS_VISIBLE, CRect(0,0,180,180),this,IDC_MAP2)) 
        return -1; 
	if (!m_ctrlMapX.Create(NULL, WS_VISIBLE, CRect(0,0,400,400),this,IDC_MAP)) 
        return -1;	 
	    m_ctrlMapX.SetGeoSet(&"CHINA"); 
        m_eaglaeMapX.SetGeoSet(&"CHINA"); 
	try { 
		// create some custom tools for object drawing 
        m_ctrlMapX.ZoomTo(1000,m_ctrlMapX.GetCenterX(),m_ctrlMapX.GetCenterY()); 
		//m_ctrlMapX.CreateCustomTool(CUST_INFO, miToolTypePoint, miCrossCursor); 
		LyrTemp=m_eaglaeMapX.GetLayers().CreateLayer("Pan"); 
		m_ctrlMapX.SetTitleText("");  
		m_eaglaeMapX.SetTitleText(""); 
        //m_eaglaeMapX.u 
		//m_eaglaeMapX.SetBackColor(111); 
        
        
	} 
	catch (COleException *e) { 
		e->ReportError(); 
		e->Delete(); 
	} 
	return 0; 
} 
 
void CEagleMapView::OnSize(UINT nType, int cx, int cy) //大小随框架变化 
{ 
	CView::OnSize(nType, cx, cy); 
	if (cx != 0 && cy != 0) 
       m_ctrlMapX.MoveWindow(0,0,cx,cy,TRUE); 
	// TODO: Add your message handler code here	 
} 
 
void CEagleMapView::OnMapToolZoomout() //放大 
{ 
	// TODO: Add your command handler code here 
	m_ctrlMapX.SetCurrentTool(miZoomOutTool); 
} 
 
void CEagleMapView::OnMapToolZoomin() //缩小 
{ 
	// TODO: Add your command handler code here 
	m_ctrlMapX.SetCurrentTool(miZoomInTool); 
} 
 
void CEagleMapView::OnMapToolPan() //漫游 
{ 
	// TODO: Add your command handler code here 
	m_ctrlMapX.SetCurrentTool(miPanTool); 
} 
 
void CEagleMapView::OnInfoTool() // 
{ 
	// TODO: Add your command handler code here 
	try{ //Set the current tool to the Custom tool CUST_INFO 
		m_ctrlMapX.SetCurrentTool(CUST_INFO); 
	}  
	catch (COleDispatchException *e) { 
		e->ReportError(); 
		e->Delete(); 
	} catch (COleException *e) { 
		e->ReportError(); 
		e->Delete(); 
	} 
} 
void CEagleMapView::OnViewLayercontrol() //图层控制 
{ 
	// TODO: Add your command handler code here 
	try { 
		COptionalVariant vHelpFile, vHelpID; // mark as optional since we don't have a helpfile 
		m_ctrlMapX.GetLayers().LayersDlg(vHelpFile, vHelpID); 
	}  
	catch (COleDispatchException *e) { 
		e->ReportError(); 
		e->Delete(); 
	}  
} 
 
void CEagleMapView::OnSetFocus(CWnd* pOldWnd)  
{ 
	CView::OnSetFocus(pOldWnd); 
 
	m_eaglaeMapX.SetFocus(); 
	// TODO: Add your message handler code here 
	 
} 
//////////////////////////////////鼠标处理/////////////////////////////////////////// 
void CEagleMapView::OnMouseDownMap(short Button, short Shift, float X, float Y)  
 { 
	 
    if(Button == 2) 
	   m_eaglaeMapX.GetLayers().LayersDlg(); 
 
	double mapx,mapy; 
    m_eaglaeMapX.ConvertCoord(&X,&Y,&mapx,&mapy,miScreenToMap); 
    m_ctrlMapX.SetCenterX(mapx); 
    m_ctrlMapX.SetCenterY(mapy); 
	bDown=1; 
 
 } 
 
BOOL CEagleMapView::OnMouseUpInMap(short Button, short Shift, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y) 
{ 
	// when the user right clicks on the map, bring up the MapX layers dialog.  
    bDown=0; 
    return -1; 
} 
 
BOOL CEagleMapView::OnMouseMoveInMap(short Button, short Shift, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y) 
{ 
 
	if (bDown==1) 
	{ 
		double mapx,mapy; 
	    float X, Y; 
        X=float(x); 
        Y=float(y); 
        m_eaglaeMapX.ConvertCoord(&X,&Y,&mapx,&mapy,miScreenToMap); 
        m_ctrlMapX.SetCenterX(mapx); 
        m_ctrlMapX.SetCenterY(mapy); 
	} 
    return -1; 
} 
 
void CEagleMapView::OnMapViewChanged()  
{ 
 
    double X1,Y1,X2,Y2;  	 		 		 	//声明坐标变量 
    CMapXFeature tempFtr;      			    	//声明Feature变量 
    CMapXStyle tempStyle;                       //声明Style变量 
	CMapXFeatures tempFtrs;     				//声明Features变量	 
    CMapXLayer  layer;       					//声明layer变量 
 
    CMapXPoints points;    				        //声明Points变量 
	points.CreateDispatch(points.GetClsid());   //必须在此初始化加入 
 
	CMapXRectangle rect;       			     	//声明矩形变量 
	rect.CreateDispatch(rect.GetClsid());       //必须在此初始化加入 
 
	rect = m_ctrlMapX.GetBounds(); 
	X1 = rect.GetXMin();       					//获得矩形左上顶点x坐标 
	Y1 = rect.GetYMin();       					//获得矩形左上顶点y坐标 
	X2 = rect.GetXMax();       			    	//获得矩形右下顶点x坐标 
	Y2 = rect.GetYMax();       			    	//获得矩形右下顶点y坐标 
 
    layer=m_eaglaeMapX.GetLayers().Item("Pan"); //在此初始化 
    tempFtrs=layer.AllFeatures();               //必须在此初始化加入 
 
    if(tempFtrs.GetCount()==0)  //如果矩形边框还没有//必须在此初始化Ftr 
	{    
        //在临时图层添加大小为Map1的边界的Rectangle对象//必须注意点加入的顺序 
		points.AddXY(X1,Y1); 						        //添加顶点1 
		points.AddXY(X2,Y1);								//添加顶点2 
		points.AddXY(X2,Y2); 								//添加顶点3 
		points.AddXY(X1,Y2); 								//添加顶点4 
 
        //创建矩形Feature 
		COleVariant vtPoints; 
		vtPoints.vt = VT_DISPATCH; 
		vtPoints.pdispVal = points.m_lpDispatch; 
		vtPoints.pdispVal->AddRef(); 
 
        tempFtr = m_eaglaeMapX.GetFeatureFactory().CreateRegion(vtPoints); 
 
		//设置矩形Feature的属性 
		tempStyle=tempFtr.GetStyle();                        //必须在此初始化加入 
        tempStyle.SetRegionPattern(miPatternNoFill); 
        tempStyle.SetRegionBorderColor(255); 
        tempStyle.SetRegionBorderWidth(2);              	 
		tempFtr.SetStyle(tempStyle.m_lpDispatch); 
 
        Ftr=layer.AddFeature(tempFtr);   
 
	} 
    else //根据Map1的视野变化改变矩形边框的大小和位置 
    { 
		Ftr.GetParts().Item(1).RemoveAll(); 
		Ftr.GetParts().Item(1).AddXY(X1, Y1); 
        Ftr.GetParts().Item(1).AddXY(X2, Y1); 
        Ftr.GetParts().Item(1).AddXY(X2, Y2); 
        Ftr.GetParts().Item(1).AddXY(X1, Y2); 
        Ftr.Update(); 
	 
    } 
layer.Refresh(); 
	 
 
	LyrTemp.Refresh();	  
 
}