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();
}