www.pudn.com > MapMark.rar > MapMarkView.cpp
// MapMarkView.cpp : implementation of the CMapMarkView class
//
#include "stdafx.h"
#include "MapMark.h"
#include "MapX.h"
#include "MapMarkDoc.h"
#include "MapMarkView.h"
#include "AddSymbol.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//自定义工具
#define miAddSymbol1 1 //添加图标1
#define miDeleteSymbol 4 //删除标记
#define miMoveSymbol 5 //移动标记
//自定义图层
#define SymbolLayer "SymbolLayer" //用户标注图层
/////////////////////////////////////////////////////////////////////////////
// CMapMarkView
CMapX MapXObj;
IMPLEMENT_DYNCREATE(CMapMarkView, CView)
BEGIN_MESSAGE_MAP(CMapMarkView, CView)
//{{AFX_MSG_MAP(CMapMarkView)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_SETFOCUS()
ON_COMMAND(ID_MAP_ARROW, OnMapArrow)
ON_COMMAND(ID_MAP_CENTER, OnMapCenter)
ON_COMMAND(ID_MAP_PAN, OnMapPan)
ON_COMMAND(ID_MAP_ZOOMIN, OnMapZoomin)
ON_COMMAND(ID_MAP_ZOOMOUT, OnMapZoomout)
ON_UPDATE_COMMAND_UI(ID_MAP_ARROW, OnUpdateMapArrow)
ON_UPDATE_COMMAND_UI(ID_MAP_CENTER, OnUpdateMapCenter)
ON_UPDATE_COMMAND_UI(ID_MAP_PAN, OnUpdateMapPan)
ON_UPDATE_COMMAND_UI(ID_MAP_ZOOMIN, OnUpdateMapZoomin)
ON_UPDATE_COMMAND_UI(ID_MAP_ZOOMOUT, OnUpdateMapZoomout)
ON_COMMAND(ID_SYMBOL_CUT, OnSymbolCut)
ON_UPDATE_COMMAND_UI(ID_SYMBOL_CUT, OnUpdateSymbolCut)
ON_COMMAND(ID_SYMBOL_MOVE, OnSymbolMove)
ON_UPDATE_COMMAND_UI(ID_SYMBOL_MOVE, OnUpdateSymbolMove)
ON_COMMAND(ID_Button1, OnButton1)
ON_UPDATE_COMMAND_UI(ID_Button1, OnUpdateButton1)
ON_COMMAND(ID_Button2, OnButton2)
ON_COMMAND(ID_Button3, OnButton3)
ON_COMMAND(ID_Button4, OnButton4)
ON_COMMAND(ID_Button5, OnButton5)
//}}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(CMapMarkView, CView)
// ON_EVENT(MapMarkView, IDC_MAP, DISPID_DBLCLICK, OnDblClick,NULL)
ON_EVENT(CMapMarkView, IDC_MAP, DISPID_MOUSEMOVE, OnMouseMove_Map, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
ON_EVENT(CMapMarkView, IDC_MAP, DISPID_MOUSEDOWN, OnMouseDown_Map, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
ON_EVENT(CMapMarkView, IDC_MAP, DISPID_MOUSEUP, OnMouseUp_Map, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
ON_EVENT(CMapMarkView, IDC_MAP, MAPX_DISPID_TOOLUSED, OnToolUsed, VTS_I2 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_BOOL VTS_BOOL VTS_PBOOL)
ON_EVENT(CMapMarkView, IDC_MAP, 6 /* MapViewChanged */, OnMapViewChangedMap, VTS_NONE)
// ON_EVENT(CMapMarkView, IDC_MAP, 11 /* PolyToolUsed */, OnPolyToolUsedMap, VTS_I2 VTS_I4 VTS_DISPATCH VTS_BOOL VTS_BOOL VTS_PBOOL)
END_EVENTSINK_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMapMarkView construction/destruction
CMapMarkView::CMapMarkView()
{
// TODO: add construction code here
m_bSymbolMove = false;
}
CMapMarkView::~CMapMarkView()
{
}
BOOL CMapMarkView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMapMarkView drawing
void CMapMarkView::OnDraw(CDC* pDC)
{
CMapMarkDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CMapMarkView printing
BOOL CMapMarkView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMapMarkView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMapMarkView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMapMarkView diagnostics
#ifdef _DEBUG
void CMapMarkView::AssertValid() const
{
CView::AssertValid();
}
void CMapMarkView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMapMarkDoc* CMapMarkView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMapMarkDoc)));
return (CMapMarkDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMapMarkView message handlers
int CMapMarkView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
if (!MapXObj.Create(NULL, WS_VISIBLE, CRect(0,0,100,100), this,IDC_MAP))
{
return -1;
}
try
{
MapXObj.SetGeoSet(MAIN_MAP_NAME); //指定地图集
MapXObj.SetTitleText("");
m_dInitCenterX=MapXObj.GetCenterX();
m_dInitCenterY=MapXObj.GetCenterY();
m_dInitZoom=MapXObj.GetZoom();
if (m_dInitZoom <= 0)
{
MessageBox("未指定地图集,请确认地图数据是否正确安装。");
}
MapXObj.CreateCustomTool(miAddSymbol1,NULL,miArrowCursor);
MapXObj.CreateCustomTool(miDeleteSymbol,NULL,miArrowCursor);
MapXObj.CreateCustomTool(miMoveSymbol,NULL,miArrowCursor);
MapXObj.GetLayers().Item(SymbolLayer).SetAutoLabel(true);
}
catch (COleDispatchException *e)
{
e->ReportError();
e->Delete();
}
catch (COleException *e)
{
e->ReportError();
e->Delete();
}
MapXObj.SetRedrawInterval(2000);
return 0;
}
void CMapMarkView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
MapXObj.MoveWindow(0,0,cx,cy,TRUE);
}
void CMapMarkView::OnSetFocus(CWnd* pOldWnd)
{
CView::OnSetFocus(pOldWnd);
// TODO: Add your message handler code here
MapXObj.SetFocus();
}
void CMapMarkView::OnMapArrow()
{
// TODO: Add your command handler code here
try
{
MapXObj.SetCurrentTool(miArrowTool);
MapXObj.SetMousePointer(miDefaultCursor); //鼠标形状还原
MapXObj.SetMousewheelSupport(miNoMousewheelSupport); //停止支持滚轮缩放
}
catch (COleDispatchException *e)
{
e->ReportError();
e->Delete();
}
catch (COleException *e)
{
e->ReportError();
e->Delete();
}
}
void CMapMarkView::OnUpdateMapArrow(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
BOOL bCheck;
if(miArrowTool == MapXObj.GetCurrentTool())
bCheck=TRUE;
else
bCheck=FALSE;
pCmdUI->SetCheck(bCheck);
}
void CMapMarkView::OnMapCenter()
{
// TODO: Add your command handler code here
try
{
MapXObj.SetZoom(m_dInitZoom);
MapXObj.SetCenterX(m_dInitCenterX);
MapXObj.SetCenterY(m_dInitCenterY);
}
catch (COleDispatchException *e)
{
e->ReportError();
e->Delete();
}
catch (COleException *e)
{
e->ReportError();
e->Delete();
}
}
void CMapMarkView::OnUpdateMapCenter(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CMapMarkView::OnMapPan()
{
// TODO: Add your command handler code here
try
{
MapXObj.SetCurrentTool(miPanTool);
}
catch (COleDispatchException *e)
{
e->ReportError();
e->Delete();
}
catch (COleException *e)
{
e->ReportError();
e->Delete();
}
}
void CMapMarkView::OnUpdateMapPan(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
BOOL bCheck;
if(miPanTool==MapXObj.GetCurrentTool())
bCheck=TRUE;
else
bCheck=FALSE;
pCmdUI->SetCheck(bCheck);
}
void CMapMarkView::OnMapZoomin()
{
// TODO: Add your command handler code here
try
{
if(miZoomInTool==MapXObj.GetCurrentTool())
MapXObj.SetCurrentTool(miArrowTool);
else
{
MapXObj.SetCurrentTool(miZoomInTool);
MapXObj.SetMousewheelSupport(miFullMousewheelSupport);
}
}
catch (COleDispatchException *e)
{
e->ReportError();
e->Delete();
}
catch (COleException *e)
{
e->ReportError();
e->Delete();
}
}
void CMapMarkView::OnUpdateMapZoomin(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
BOOL bCheck;
if(miZoomInTool==MapXObj.GetCurrentTool())
bCheck=TRUE;
else
bCheck=FALSE;
pCmdUI->SetCheck(bCheck);
}
void CMapMarkView::OnMapZoomout()
{
// TODO: Add your command handler code here
try
{
if(miZoomOutTool==MapXObj.GetCurrentTool())
MapXObj.SetCurrentTool(miArrowTool);
else
{
MapXObj.SetCurrentTool(miZoomOutTool);
MapXObj.SetMousewheelSupport(miFullMousewheelSupport); //支持滚轮缩放
}
}
catch (COleDispatchException *e)
{
e->ReportError();
e->Delete();
}
catch (COleException *e)
{
e->ReportError();
e->Delete();
}
}
void CMapMarkView::OnUpdateMapZoomout(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
BOOL bCheck;
if(miZoomOutTool==MapXObj.GetCurrentTool())
bCheck=TRUE;
else
bCheck=FALSE;
pCmdUI->SetCheck(bCheck);
}
void CMapMarkView::OnToolUsed(short ToolNum, double X1, double Y1, double X2, double Y2, double Distance, bool Shift, bool Ctrl, bool *EnableDefault)
{
CMarkObj MarkObject;
CString strLayername;
CString strSymbolName;
CString strSymbolID;
double dX,dY;
if(miAddSymbol1==ToolNum)
{
strLayername = SymbolLayer;
strSymbolID = "MyIcon1";
strSymbolName = "图标的中文标注(最长50个中文字符)";
CAddSymbol dlgAddSymbol(strSymbolName,X1,Y1);
if(IDOK==dlgAddSymbol.DoModal())
{
dlgAddSymbol.GetName(strSymbolName);
dlgAddSymbol.GetPosition(dX,dY);
}
MarkObject.MarkInit(strLayername,strSymbolName,dX,dY,strSymbolID);
}
if(miDeleteSymbol==ToolNum) //删除图标
{
OnCustomDeleteSymbol(X1,Y1);
}
}
void CMapMarkView::OnSymbolCut()
{
if(miDeleteSymbol==MapXObj.GetCurrentTool())
{
MapXObj.SetCurrentTool(miArrowTool);
}
else
{
MapXObj.SetCurrentTool(miDeleteSymbol);
}
}
void CMapMarkView::OnUpdateSymbolCut(CCmdUI* pCmdUI)
{
BOOL bCheck;
if(miDeleteSymbol==MapXObj.GetCurrentTool())
bCheck=TRUE;
else
bCheck=FALSE;
pCmdUI->SetCheck(bCheck);
}
void CMapMarkView::OnSymbolMove()
{
if(miMoveSymbol==MapXObj.GetCurrentTool())
{
MapXObj.SetCurrentTool(miArrowTool);
}
else
{
MapXObj.SetCurrentTool(miMoveSymbol);
}
}
void CMapMarkView::OnUpdateSymbolMove(CCmdUI* pCmdUI)
{
BOOL bCheck;
if(miMoveSymbol==MapXObj.GetCurrentTool())
bCheck=TRUE;
else
bCheck=FALSE;
pCmdUI->SetCheck(bCheck);
}
void CMapMarkView::OnCustomDeleteSymbol(double X, double Y)
{
try
{
CMapXLayer layer;
CMapXFeature Ftr;
CMapXFeatures Ftrs;
CMapXPoint ps;
int iNum,iFeatureCount;
CString strKeyValue;
ps.CreateDispatch(ps.GetClsid());
ps.Set(X,Y);
layer=MapXObj.GetLayers().Item(SymbolLayer);
Ftrs=layer.SearchAtPoint(ps);
iNum=Ftrs.GetCount();
if(0!=iNum)
{
Ftr=Ftrs.Item(1); //获取选中图元的FeatureKey作为判断依据
strKeyValue = Ftr.GetKeyValue() ;
if(IDOK==MessageBox("删除该图标?","警告",MB_ICONWARNING|MB_OKCANCEL))
{
Ftrs = layer.AllFeatures();
iFeatureCount = layer.AllFeatures().GetCount();
for (int i=1;i<=iFeatureCount;i++)
{
Ftr=Ftrs.Item(i);
if (Ftr.GetKeyValue() == strKeyValue)
{
layer.DeleteFeature(Ftr.GetFeatureKey());
}
}
}
}
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
//清除图层中的所有图元
void CMapMarkView::ClearLayer(CString strLayerName)
{
CMapXLayer layer;
CMapXFeature Ftr;
CMapXFeatures Ftrs;
int iFtrNum;
try
{
layer=MapXObj.GetLayers().Item(SymbolLayer);
Ftrs=layer.AllFeatures();
iFtrNum=Ftrs.GetCount();
for(int i=1; i<=iFtrNum; i++)
{
Ftr=Ftrs.Item(i);
layer.DeleteFeature(Ftr.GetFeatureKey());
}
MapXObj.Refresh(); //屏幕显示刷新
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CMapMarkView::OnMouseMove_Map(short Button, short Shift, long X, long Y)
{
CString sCoordinate;
double lon, lat;
float singleX = (float)X;
float singleY = (float)Y;
int iXd;
int iXm;
int iXs;
int iYd;
int iYm;
int iYs;
try
{
m_pMainFrame = (CMainFrame *)GetParentFrame(); //获取父窗口句柄
MapXObj.ConvertCoord(&singleX, &singleY, &lon, &lat, miScreenToMap); //屏幕坐标转换为地图坐标
DecimalGeoToStandardGeo(lon,lat,&iXd,&iXm,&iXs,&iYd,&iYm,&iYs); //小数坐标==>标准地理坐标
sCoordinate.Format("经度:%d°%d′%d\" ,纬度:%d°%d′%d\" ",iXd,iXm,iXs,iYd,iYm,iYs); //在状态栏中显示当前坐标
m_pMainFrame->m_wndStatusBar.SetPaneText(m_pMainFrame->m_wndStatusBar.CommandToIndex(ID_INDICATOR_COORDINATE),sCoordinate);
}
catch (COleDispatchException *e)
{
e->ReportError();
e->Delete();
}
catch (COleException *e)
{
e->ReportError();
e->Delete();
}
if (m_bSymbolMove)
{
try
{
CMapXFeature Ftr;
CMapXFeatures Ftrs;
CMapXPoint ps;
int iFeatureCount;
CString strKeyValue;
ps.CreateDispatch(ps.GetClsid());
ps.Set(lon,lat);
Ftrs = m_Selectlayer.AllFeatures();
iFeatureCount = m_Selectlayer.AllFeatures().GetCount();
Ftr=Ftrs.Item(1);
if (Ftr.GetKeyValue() == m_strSelectKey)
{
Ftr.SetPoint(ps); //改变定位点
Ftr.Update();
}
}
catch (COleDispatchException *e)
{
e->ReportError();
e->Delete();
}
catch (COleException *e)
{
e->ReportError();
e->Delete();
}
}
}
void CMapMarkView::OnMouseDown_Map(short Button, short Shift, long X, long Y)
{
double lon, lat;
if (MapXObj.GetCurrentTool() == miMoveSymbol)
{
try
{
float singleX = (float)X;
float singleY = (float)Y;
CMapXFeature Ftr;
CMapXFeatures Ftrs;
CMapXPoint ps;
int iNum;
MapXObj.ConvertCoord(&singleX, &singleY, &lon, &lat, miScreenToMap); //屏幕坐标转换为地图坐标
ps.CreateDispatch(ps.GetClsid());
ps.Set(lon,lat);
m_Selectlayer=MapXObj.GetLayers().Item(SymbolLayer);
Ftrs=m_Selectlayer.SearchAtPoint(ps);
iNum=Ftrs.GetCount();
if(0!=iNum)
{
Ftr=Ftrs.Item(1); //获取选中图元的FeatureKey作为判断依据
m_strSelectKey = Ftr.GetKeyValue() ;
m_bSymbolMove = true;
}
}
catch (COleDispatchException *e)
{
e->ReportError();
e->Delete();
}
catch (COleException *e)
{
e->ReportError();
e->Delete();
}
}
}
void CMapMarkView::OnMouseUp_Map(short Button, short Shift, long X, long Y)
{
if (m_bSymbolMove)
{
m_bSymbolMove = false;
}
}
void CMapMarkView::DecimalGeoToStandardGeo(double dX, double dY, int *iXd, int *iXm, int *iXs, int *iYd, int *iYm, int *iYs)
{
double dLongitude,dLatitude,dTemp;
dLongitude=dX;
dLatitude=dY;
dTemp=dLongitude-(int)(dLongitude);
*iXd=int(dLongitude);
*iXm=int(dTemp*60);
*iXs=int((dTemp*60-int(dTemp*60))*60);
dTemp=dLatitude-(int)(dLatitude);
*iYd=int(dLatitude);
*iYm=int(dTemp*60);
*iYs=int((dTemp*60-int(dTemp*60))*60);
}
void CMapMarkView::OnMapViewChangedMap()
{
double dZoom;
double dPaperWidth;
double dScale;
long lScale;
m_pMainFrame = (CMainFrame *)GetParentFrame(); //获取父窗口句柄
dZoom=MapXObj.GetZoom();
dPaperWidth=MapXObj.GetMapPaperWidth();
dScale=dZoom/dPaperWidth;
lScale=(long)dScale;
if (m_pMainFrame->m_wndStatusBar.m_hWnd == NULL)
{
return;
}
CString strScale;
strScale.Format("比例尺:1:%ld",lScale);
m_pMainFrame->m_wndStatusBar.SetPaneText(m_pMainFrame->m_wndStatusBar.CommandToIndex(ID_INDICATOR_SCALE),strScale);
}
void CMapMarkView::OnButton1()
{
// TODO: Add your command handler code here
if(miAddSymbol1==MapXObj.GetCurrentTool())
{
MapXObj.SetCurrentTool(miArrowTool);
}
else
{
MapXObj.SetCurrentTool(miAddSymbol1);
}
}
void CMapMarkView::OnUpdateButton1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
BOOL bCheck;
if(miAddSymbol1==MapXObj.GetCurrentTool())
bCheck=TRUE;
else
bCheck=FALSE;
pCmdUI->SetCheck(bCheck);
}
void CMapMarkView::OnButton2()
{
// TODO: Add your command handler code here
}
void CMapMarkView::OnButton3()
{
// TODO: Add your command handler code here
}
void CMapMarkView::OnButton4()
{
// TODO: Add your command handler code here
}
void CMapMarkView::OnButton5()
{
// TODO: Add your command handler code here
}