www.pudn.com > MyGPSDemo.rar > MapView.cpp
// MapView.cpp : implementation of the CMapView class
//
#include "stdafx.h"
#include "MapDemo.h"
#include "MapDemoDoc.h"
#include "MapView.h"
#include "MapFormView.h"
#include "MainFrm.h"
#include "GeoSetDlg.h"
#include "MapXSetDlg.h"
#include "SelDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define IDC_MAP 100
#define MYTOOL_INFO 1
#define MYTOOL_DISTANCE 2
/////////////////////////////////////////////////////////////////////////////
// CMapView
IMPLEMENT_DYNCREATE(CMapView, CView)
BEGIN_MESSAGE_MAP(CMapView, CView)
//{{AFX_MSG_MAP(CMapView)
ON_WM_SIZE()
ON_WM_CREATE()
ON_COMMAND(ID_FILE_OPENGEOSET, OnFileOpengeoset)
ON_COMMAND(ID_VIEW_SYSOPTION, OnViewSysoption)
ON_COMMAND(ID_MAP_TOOL_SELECT, OnMapToolSelect)
ON_COMMAND(ID_MAP_TOOL_ZOOMIN, OnMapToolZoomin)
ON_COMMAND(ID_MAP_TOOL_ZOOMOUT, OnMapToolZoomout)
ON_COMMAND(ID_MAP_TOOL_PAN, OnMapToolPan)
ON_COMMAND(ID_MAP_TOOL_RADIUSSELECT, OnMapToolRadiusselect)
ON_COMMAND(ID_MAP_TOOL_RECTANGLESELECT, OnMapToolRectangleselect)
ON_COMMAND(ID_MAP_TOOL_INFORMATION, OnMapToolInformation)
ON_COMMAND(ID_VIEW_LAYERCONTROL, OnViewLayercontrol)
ON_COMMAND(ID_VIEW_SCALEBAR, OnViewScalebar)
ON_UPDATE_COMMAND_UI(ID_VIEW_SCALEBAR, OnUpdateViewScalebar)
ON_COMMAND(ID_TOOL_UNSELECTALL, OnToolUnselectall)
ON_COMMAND(ID_MAPEDIT_SELETTABLE, OnMapeditSelettable)
ON_COMMAND(ID_MAPEDIT_ADDTEXT, OnMapeditAddtext)
ON_COMMAND(ID_MAPEDIT_ADDSYMBOL, OnMapeditAddsymbol)
ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDTEXT, OnUpdateMapeditAddtext)
ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDSYMBOL, OnUpdateMapeditAddsymbol)
ON_COMMAND(ID_MAPEDIT_ADDLINE, OnMapeditAddline)
ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDLINE, OnUpdateMapeditAddline)
ON_COMMAND(ID_MAPEDIT_ADDPOLYGON, OnMapeditAddpolygon)
ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDPOLYGON, OnUpdateMapeditAddpolygon)
ON_COMMAND(ID_MAPEDIT_ADDRECT, OnMapeditAddrect)
ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDRECT, OnUpdateMapeditAddrect)
ON_COMMAND(ID_MAPEDIT_ADDEPPLISE, OnMapeditAddepplise)
ON_UPDATE_COMMAND_UI(ID_MAPEDIT_ADDEPPLISE, OnUpdateMapeditAddepplise)
ON_COMMAND(IDD_MAPEDIT_ADDARC, OnMapeditAddarc)
ON_UPDATE_COMMAND_UI(IDD_MAPEDIT_ADDARC, OnUpdateMapeditAddarc)
ON_WM_DESTROY()
ON_COMMAND(ID_ADD_TARGET, OnAddTarget)
ON_COMMAND(ID_EDIT_TARGET, OnEditTarget)
ON_COMMAND(ID_START_GPS, OnStartGps)
ON_UPDATE_COMMAND_UI(ID_START_GPS, OnUpdateStartGps)
ON_COMMAND(ID_END_GPS, OnEndGps)
ON_UPDATE_COMMAND_UI(ID_END_GPS, OnUpdateEndGps)
ON_UPDATE_COMMAND_UI(ID_ADD_TARGET, OnUpdateAddTarget)
ON_UPDATE_COMMAND_UI(ID_EDIT_TARGET, OnUpdateEditTarget)
ON_COMMAND(ID_GPS_CHANGESYMBOL, OnGpsChangesymbol)
ON_UPDATE_COMMAND_UI(ID_GPS_CHANGESYMBOL, OnUpdateGpsChangesymbol)
ON_WM_TIMER()
ON_COMMAND(ID_CHANGE_SYMBOL, OnChangeSymbol)
ON_UPDATE_COMMAND_UI(ID_CHANGE_SYMBOL, OnUpdateChangeSymbol)
ON_COMMAND(ID_LINE_CHANGE, OnLineChange)
ON_COMMAND(ID_REAGION_CHANGE, OnReagionChange)
ON_COMMAND(ID_MAPX_PROPERTY, OnMapxProperty)
ON_COMMAND(ID_DATABIND_NORMAL, OnDatabindNormal)
ON_UPDATE_COMMAND_UI(ID_DATABIND_NORMAL, OnUpdateDatabindNormal)
ON_COMMAND(ID_BINDDATA_ODBC, OnBinddataOdbc)
ON_UPDATE_COMMAND_UI(ID_BINDDATA_ODBC, OnUpdateBinddataOdbc)
ON_COMMAND(ID_BINDDATA_ARRAY, OnBinddataArray)
ON_UPDATE_COMMAND_UI(ID_BINDDATA_ARRAY, OnUpdateBinddataArray)
ON_COMMAND(ID_BINDDATA_NOBIND, OnBinddataNobind)
ON_UPDATE_COMMAND_UI(ID_BINDDATA_NOBIND, OnUpdateBinddataNobind)
ON_COMMAND(ID_THEME_REANGE, OnThemeReange)
ON_UPDATE_COMMAND_UI(ID_THEME_REANGE, OnUpdateThemeReange)
ON_COMMAND(ID_THEME_DOT, OnThemeDot)
ON_UPDATE_COMMAND_UI(ID_THEME_DOT, OnUpdateThemeDot)
ON_COMMAND(ID_THEME_PIE, OnThemePie)
ON_UPDATE_COMMAND_UI(ID_THEME_PIE, OnUpdateThemePie)
ON_COMMAND(ID_THEME_SYMBOL, OnThemeSymbol)
ON_UPDATE_COMMAND_UI(ID_THEME_SYMBOL, OnUpdateThemeSymbol)
ON_COMMAND(ID_THEME_INDIV, OnThemeIndiv)
ON_UPDATE_COMMAND_UI(ID_THEME_INDIV, OnUpdateThemeIndiv)
ON_COMMAND(ID_THEME_BAR, OnThemeBar)
ON_UPDATE_COMMAND_UI(ID_THEME_BAR, OnUpdateThemeBar)
//}}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()
////////////////////////////////////////////////////////
//MapX事件响应函数
//使用用户自定义图层
BEGIN_EVENTSINK_MAP(CMapView, CView)
ON_EVENT(CMapView, IDC_MAP, MAPX_DISPID_DRAWUSERLAYER, OnDrawUserLayer, VTS_DISPATCH VTS_I4 VTS_I4 VTS_DISPATCH VTS_DISPATCH)
ON_EVENT(CMapView, 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(CMapView, IDC_MAP, MAPX_DISPID_POLYTOOLUSED, OnPolyToolUsedMap, VTS_I2 VTS_I4 VTS_DISPATCH VTS_BOOL VTS_BOOL VTS_PBOOL)
ON_EVENT(CMapView, IDC_MAP, -605 /* MouseDown */, OnMouseDownMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4)
ON_EVENT(CMapView, IDC_MAP, DISPID_MOUSEUP, OnMouseUpInMap, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
ON_EVENT(CMapView, IDC_MAP, DISPID_MOUSEMOVE, OnMouseMoveInMap, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
END_EVENTSINK_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMapView construction/destruction
CMapView::CMapView()
{
m_dPrevZoom = 0;
m_dCurZoom = 0;
m_bScaleBar = FALSE;
//m_bODBCDynamic = FALSE;
m_strEditLayer="";
m_bIsStartGps=FALSE;
m_nGpsOperation=GPS_NOOPERATION;
m_bIsAutoLable=FALSE;
m_pTarget=NULL;
}
CMapView::~CMapView()
{
}
BOOL CMapView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMapView drawing
void CMapView::OnDraw(CDC* pDC)
{
CMapDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CMapView printing
BOOL CMapView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMapView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMapView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMapView diagnostics
#ifdef _DEBUG
void CMapView::AssertValid() const
{
CView::AssertValid();
}
void CMapView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMapDemoDoc* CMapView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMapDemoDoc)));
return (CMapDemoDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMapView message handlers
void CMapView::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);
}
BOOL CMapView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
int CMapView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// 使用缺省尺寸创建一个地图
// 在OnSize函数里改变地图控件的大小,使之缩放到屏幕尺寸
m_ctrlMapX.Create(NULL, WS_VISIBLE, CRect(0,0,100,100), this, IDC_MAP);
// 创建距离工具
try {
// create some custom tools for object drawing
m_ctrlMapX.CreateCustomTool(MYTOOL_DISTANCE, miToolTypePoly, miCrossCursor);
m_ctrlMapX.CreateCustomTool(MYTOOL_INFO, miToolTypePoint, miCrossCursor);
//绘图工具
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_TEXT_TOOL,miToolTypePoint,miCrossCursor);
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_SYMBOL_TOOL,miToolTypePoint,miCrossCursor);
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_LINE_TOOL,miToolTypeLine,miCrossCursor);
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_ELLIPSE_TOOL,miToolTypeMarquee,miCrossCursor);
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_RECT_TOOL,miToolTypeMarquee,miCrossCursor);
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_REGION_TOOL,miToolTypePoly,miCrossCursor);
m_ctrlMapX.CreateCustomTool(CUSTOM_DRAW_ARC_TOOL,miToolTypeLine,miCrossCursor);
//GPS工具
m_ctrlMapX.CreateCustomTool(GPS_ADDTARGET,miToolTypePoint,miArrowCursor);
m_ctrlMapX.CreateCustomTool(GPS_EDITTARGET,miToolTypePoint,miArrowCursor);
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
SetTitleVisible(FALSE);
OnViewScalebar();
return 0;
}
void CMapView::NotifyQueryNewPalette()
{
// we don't care, but our embedded control might
m_ctrlMapX.SendMessage(WM_QUERYNEWPALETTE);
}
void CMapView::NotifyPaletteChanged(CWnd* pFocusWnd)
{
// we don't care, but our embedded control might
m_ctrlMapX.SendMessage(WM_PALETTECHANGED, (WPARAM)(pFocusWnd->m_hWnd));
}
void CMapView::OnFileOpengeoset()
{
CGeoSetDlg geoDlg(&m_ctrlMapX);
geoDlg.DoModal();
}
void CMapView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
}
void CMapView::OnViewSysoption()
{
MapXSetDlg dlg(&m_ctrlMapX);
dlg.DoModal();
}
void CMapView::OnMapToolSelect()
{
m_ctrlMapX.SetCurrentTool(miSelectTool);
}
void CMapView::OnMapToolZoomin()
{
m_ctrlMapX.SetCurrentTool(miZoomInTool);
}
void CMapView::OnMapToolZoomout()
{
m_ctrlMapX.SetCurrentTool(miZoomOutTool);
}
void CMapView::OnMapToolPan()
{
m_ctrlMapX.SetCurrentTool(miPanTool);
}
void CMapView::OnMapToolRadiusselect()
{
m_ctrlMapX.SetCurrentTool(miRadiusSelectTool);
}
void CMapView::OnMapToolRectangleselect()
{
m_ctrlMapX.SetCurrentTool(miRectSelectTool);
}
void CMapView::OnMapToolInformation()
{
m_ctrlMapX.SetCurrentTool(miRectSelectTool);
}
void CMapView::OnToolUnselectall()
{
CMapXLayers layers=m_ctrlMapX.GetLayers();
for(int i=0;i0)
select.ClearSelection();
}
}
}
// Draw the Scalebar layer whenever this event is called
// we could check the Layer.Name property if we needed to handle
// more than 1 user draw layer
void CMapView::OnDrawUserLayer(LPDISPATCH Layer, long hOutputDC, long hAttributeDC, LPDISPATCH RectFull, LPDISPATCH RectInvalid)
{
CDC dc;
dc.Attach((HDC)hOutputDC);
dc.SetAttribDC((HDC)hAttributeDC);
DrawScaleBar(&dc);
}
void CMapView::OnViewLayercontrol()
{
try {
VARIANT vHelpFile, vHelpID; // mark as optional since we don't have a helpfile
vHelpFile.vt = VT_ERROR;
vHelpFile.scode = DISP_E_PARAMNOTFOUND;
vHelpID.vt = VT_ERROR;
vHelpID.scode = DISP_E_PARAMNOTFOUND;
CMapXLayers layers = m_ctrlMapX.GetLayers();
layers.LayersDlg(vHelpFile, vHelpID);
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
//用户自定义图层绘制比例尺
void CMapView::OnViewScalebar()
{
try {
if(m_bScaleBar)
{
m_ctrlMapX.GetLayers().Remove("ScaleBar");
m_bScaleBar = FALSE;
}
else
{
m_ctrlMapX.GetLayers().AddUserDrawLayer("ScaleBar", 1);
m_bScaleBar = TRUE;
}
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CMapView::OnUpdateViewScalebar(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bScaleBar);
}
void CMapView::DrawScaleBar(CDC *pDC)
{
float barWidth =(float)0.5, barHeight =(float)0.08;
float startX =(float).3, startY =(float).3;
long x1, y1;
int i;
// attach to dc that mapx passed us so we can use
// mfc CDC object. (we will detach before exiting this method
CPen pen;
CBrush brushRed, brushWhite, *pOldBrush;
CFont *pOldFont;
pen.CreatePen(0,1,(COLORREF)0);
brushRed.CreateSolidBrush(255);
brushWhite.CreateSolidBrush(16777215);
//Set map mode to HI-English
pDC->SetMapMode(MM_HIENGLISH);
//Set pen to black
CPen *pOldPen = pDC->SelectObject(&pen);
pOldBrush = pDC->SelectObject(&brushRed);
//convert to HiEnglish, Conversion needed because one HIENGLISH unit is .001 inch
x1=(long)(startX*1000);
y1=(long)(startY*1000);
barWidth*=1000;
barHeight*=1000;
for (i=0; i<=1; i++) {
long x2 =(long)(barWidth+x1);
long y2 =(long)(barHeight+y1);
/*** First Section ***/
if (i==0) {
pDC->SelectObject(&brushRed); //Red
}
else {
pDC->SelectObject(&brushWhite); //White
}
// with mapMode HIENGLISH, positive is x to the right, positive y is up
pDC->Rectangle(x1, -y1, x2, -y2);
/*** Second Section ***/
x1=x2;
x2=(long)(barWidth+x1);
if (i==0) {
pDC->SelectObject(&brushWhite); //White
}
else {
pDC->SelectObject(&brushRed); //Red
}
pDC->Rectangle(x1, -y1, x2, -y2);
/*** Third Section ***/
x1=x2;
x2=(long)(barWidth*2+x1);
if (i==0) {
pDC->SelectObject(&brushRed); //Red
}
else {
pDC->SelectObject(&brushWhite); //White
}
pDC->Rectangle(x1, -y1, x2, -y2);
/*** Reset Values for bottom bar pass***/
x1=(long)(startX*1000);
y1=y2;
} // End For
// Calculate Pixels Per Inch
CPoint pt(1000, 1000); // In HIENGLISH 1000 units = 1 inch
pDC->LPtoDP(&pt); // Convert inch to pixel
long lPixPerInch = pt.x;
CRect rc;
CView::GetClientRect(&rc);
float screenX, screenY;
double mapX1, mapY1;
// subtract lPixPerInch from center to get 1 inch to left of Center
screenX = (float)(rc.right/2-lPixPerInch);
screenY = (float)(rc.bottom/2);
try {
m_ctrlMapX.ConvertCoord(&screenX, &screenY, &mapX1, &mapY1, miScreenToMap);
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
double mapX2, mapY2;
// add lPixPerInch to center to get 1 inch to right of Center
screenX = (float)(rc.right/2+lPixPerInch);
screenY = (float)(rc.bottom/2);
try {
m_ctrlMapX.ConvertCoord(&screenX, &screenY, &mapX2, &mapY2, miScreenToMap);
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
CFont font;
font.CreatePointFont(100, "Arial", pDC);
pOldFont = pDC->SelectObject(&font);
pDC->SetTextColor(0); //Black
pDC->SetBkMode(TRANSPARENT);
// Output ScaleBar start Label = 0
x1=(long)(startX*1000);
y1=(long)((startY-.2)*1000);
pDC->TextOut(x1,-y1,"0");
// Output label for distance of 1 inch
x1=(long)(barWidth*2+startX*1000);
CString str;
str.Format("%.0f",m_ctrlMapX.Distance(mapX1, mapY1, mapX2, mapY2)/2);
// Need to center text over center line. will move it 60 units for each character
int iCenterAdjustment = 60*str.GetLength();
pDC->TextOut(x1-iCenterAdjustment,-y1,str);
// Output label for distance of 2 inches
x1=(long)(barWidth*4+startX*1000);
str.Format("%.0f",m_ctrlMapX.Distance(mapX1, mapY1, mapX2, mapY2));
// Need to center text over end line. will move it 60 units for each character
iCenterAdjustment = 60*str.GetLength();
pDC->TextOut(x1-iCenterAdjustment,-y1,str);
// Output label for Units "Miles"
x1=(long)(barWidth*2+startX*1000);
y1=(long)((startY+.2)*1000);
// Need to center text over center line. will move it 60 units for each character
str.Format("Miles");
iCenterAdjustment = 60*str.GetLength();
pDC->TextOut(x1-iCenterAdjustment,-y1,str);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldFont);
// detach dc so destructore won't call Release it
pDC->ReleaseAttribDC();
pDC->Detach();
}
///标题控制
void CMapView::SetTitle(CString str)
{
m_ctrlMapX.SetTitleText(str);
}
void CMapView::SetTitleVisible(BOOL bState)
{
m_ctrlMapX.GetTitle().SetVisible(bState);
}
////////////////////////////////////
void CMapView::OnMapeditSelettable()
{
CSelLayerDlg LayerDlg(&m_ctrlMapX);
LayerDlg.SetEditLayerName(m_strEditLayer);
if(LayerDlg.DoModal()==IDOK)
m_strEditLayer=LayerDlg.GetEditLayerName();
}
BOOL CMapView::FindLayer(CString strLayerName)
{
CMapXLayers layers=m_ctrlMapX.GetLayers();
for(int i=0;im_wndStatusBar.SetPaneText(0, str);
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
else if(Flags==miPolyToolEnd&&ToolNum==CUSTOM_DRAW_REGION_TOOL)
{
CMapXFeatureFactory cFactory=m_ctrlMapX.GetFeatureFactory();
CMapXLayer layer;
if(m_strEditLayer!="")
layer=m_ctrlMapX.GetLayers().Item(m_strEditLayer);
else {
AfxMessageBox("你没有选择可编辑图层,请选择编辑图层");
return;
}
CMapXFeature feature;
CMapXPoints points;
points.AttachDispatch(Points, FALSE); // don't auto release
COleVariant vtPoints;
vtPoints.vt = VT_DISPATCH;
vtPoints.pdispVal = points.m_lpDispatch;
vtPoints.pdispVal->AddRef();
feature=cFactory.CreateRegion(vtPoints);
layer.AddFeature(feature);
}
}
void CMapView::OnToolUsed(short ToolNum, double X1, double Y1, double X2, double Y2, double Distance, BOOL Shift, BOOL Ctrl, BOOL* EnableDefault)
{
CString str;
str.Format("Tool=%d, [%f,%f] [%f, %f], dist=%f, %s %s\n",
ToolNum, X1,Y1,X2,Y2,Distance, (Shift)?"Shift":"",(Ctrl)?"Ctrl":"");
TRACE(str);
//AfxMessageBox(str);
// this info tool will pop up a modal dlg
// with info from the dataset(1)
// Note that we are only getting info from the MapX Dataset
// you could use the SourceRows collection to get back
// to the source data to display info from dao, odbc or whatever
if (ToolNum == MYTOOL_INFO) {
OnInfoToolUsed(m_ctrlMapX);
}
if(ToolNum>=CUSTOM_DRAW_TEXT_TOOL&&ToolNum <= CUSTOM_DRAW_ARC_TOOL)
{
CMapXFeatureFactory cFactory=m_ctrlMapX.GetFeatureFactory();
CMapXLayer layer;
if(m_strEditLayer!="")
layer=m_ctrlMapX.GetLayers().Item(m_strEditLayer);
else {
AfxMessageBox("你没有选择可编辑图层,请选择编辑图层");
return;
}
CMapXPoint point;
point.CreateDispatch(point.GetClsid()); //Creates a dispatch for the point
CMapXFeature feature;
CMapXPoints points;
points.CreateDispatch(points.GetClsid());
CMapXRectangle rect;
rect.CreateDispatch(rect.GetClsid());
switch(ToolNum)
{
case CUSTOM_DRAW_TEXT_TOOL:
{
point.Set(X1,Y1);
COleVariant vtPoint;
vtPoint.vt = VT_DISPATCH;
vtPoint.pdispVal = point.m_lpDispatch;
vtPoint.pdispVal->AddRef();
feature=cFactory.CreateText(vtPoint,"测试文档 gg");
CMapXStyle style=feature.GetStyle();
style.PickText();
feature.SetStyle(style.m_lpDispatch);
layer.AddFeature(feature);
}
break;
case CUSTOM_DRAW_LINE_TOOL:
{
points.AddXY(X1,Y1);
points.AddXY(X2,Y2);
COleVariant vtPoints;
vtPoints.vt = VT_DISPATCH;
vtPoints.pdispVal = points.m_lpDispatch;
vtPoints.pdispVal->AddRef();
feature=cFactory.CreateLine(vtPoints);
layer.AddFeature(feature);
}
break;
case CUSTOM_DRAW_RECT_TOOL:
{
VARIANT scx,scy;
m_ctrlMapX.ConvertCoordV(&scx,&scy,COleVariant(X1),COleVariant(Y1),miMapToScreen);
VARIANT scx1,scy1;
m_ctrlMapX.ConvertCoordV(&scx1,&scy1,COleVariant(X2),COleVariant(Y2),miMapToScreen);
VARIANT mapx1,mapy1,mapx2,mapy2;
m_ctrlMapX.ConvertCoordV(&scx,&scy1,&mapx1,&mapy1,miScreenToMap);
m_ctrlMapX.ConvertCoordV(&scx1,&scy,&mapx2,&mapy2,miScreenToMap);
double x2,y2,x4,y4;
//mapx1.ChangeType(VT_R8);
x2= mapx1.dblVal;
//mapy1.ChangeType(VT_R8);
y2=mapy1.dblVal;
//mapx2.ChangeType(VT_R8);
x4=mapx2.dblVal;
//mapy2.ChangeType(VT_R8*;
y4=mapy2.dblVal;
points.AddXY(X1,Y1);
points.AddXY(x2,y2);
points.AddXY(X2,Y2);
points.AddXY(x4,y4);
COleVariant vtPoints;
vtPoints.vt = VT_DISPATCH;
vtPoints.pdispVal = points.m_lpDispatch;
vtPoints.pdispVal->AddRef();
feature=cFactory.CreateRegion(vtPoints);
layer.AddFeature(feature);
}
break;
case CUSTOM_DRAW_ARC_TOOL:
{
points.AddXY(X1,Y1);
points.AddXY(X2,Y2);
feature=cFactory.CreateArc(points.Item(1).m_lpDispatch,points.Item(2).m_lpDispatch);
layer.AddFeature(feature);
}
break;
case CUSTOM_DRAW_ELLIPSE_TOOL:
{
rect.Set(X1,Y1,X2,Y2);
feature=cFactory.CreateEllipticalRegion(rect.m_lpDispatch , 0, 30);
layer.AddFeature(feature);
}
break;
/* Select Case ToolNum
Case
ptItem.Set x1, y1
Set ftrItem = ftrFactory.CreateText(ptItem, "TEXT", _
miPositionCC, Map1.DefaultStyle)
lyrEdit.AddFeature ftrItem
Set ftrItem = Nothing
Case CUSTOM_DRAW_SYMBOL_TOOL
ptItem.Set x1, y1
Set ftrItem = ftrFactory.CreateSymbol(ptItem, Map1.DefaultStyle)
lyrEdit.AddFeature ftrItem
Set ftrItem = Nothing
Case CUSTOM_DRAW_LINE_TOOL
ptsItem.AddXY x1, y1
ptsItem.AddXY x2, y2, 2
Set ftrItem = ftrFactory.CreateLine(ptsItem, Map1.DefaultStyle)
lyrEdit.AddFeature ftrItem
Set ftrItem = Nothing
Case CUSTOM_DRAW_ELLIPSE_TOOL
rctItem.Set x1, y1, x2, y2
Set ftrItem = ftrFactory.CreateEllipticalRegion(rctItem, 0, 30, Map1.DefaultStyle)
lyrEdit.AddFeature ftrItem
Set ftrItem = Nothing
End Select
Ed If*/
}
}
}
void CMapView::OnInfoToolUsed(CMapX &cMapX)
{
/* try {
if (cMapX.GetDatasets().GetCount() == 0) {
AfxMessageBox("This info tool requires that a dataset be added.");
return;
}
CMapXPoint pt;
CMapXFeatures fs;
CMapXFeature f;
CMapXDataset ds;
pt.CreateDispatch(pt.GetClsid());
pt.Set(X1,Y1);
fs = cMapX.GetLayers().Item("USA").SearchAtPoint(pt);
// just use first feature from collection. Since usa is a layer of
// all regions, we will not get back > 1 feature in the collection
// because there are no overlapping regions
if (fs.GetCount() != 1) {
return;
}
f = fs.Item(1);
ds = cMapX.GetDatasets().Item(1);
CInfoDlg dlg;
COleVariant vRow;
COleVariant vVal;
vRow.vt = VT_DISPATCH;
vRow.pdispVal = f.m_lpDispatch;
vRow.pdispVal->AddRef();
vVal = ds.GetValue(vRow, COleVariant(2L));
vVal.ChangeType(VT_BSTR);
dlg.m_strState = vVal.bstrVal;
vVal = ds.GetValue(vRow, COleVariant(3L));
vVal.ChangeType(VT_R8);
dlg.m_dTotal = vVal.dblVal;
vVal = ds.GetValue(vRow, COleVariant(4L));
vVal.ChangeType(VT_R8);
dlg.m_dFemale = vVal.dblVal;
vVal = ds.GetValue(vRow, COleVariant(5L));
vVal.ChangeType(VT_R8);
dlg.m_dMale = vVal.dblVal;
dlg.DoModal();
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}*/
}
void CMapView::OnMapeditAddtext()
{
//m_ctrlMapX.SetCurrentTool(miTextTool);
m_ctrlMapX.SetCurrentTool(CUSTOM_DRAW_TEXT_TOOL);
}
void CMapView::OnUpdateMapeditAddtext(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ctrlMapX.GetCurrentTool()==miTextTool);
}
void CMapView::OnMapeditAddsymbol()
{
m_ctrlMapX.SetCurrentTool(miSymbolTool);
}
void CMapView::OnUpdateMapeditAddsymbol(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ctrlMapX.GetCurrentTool()==miSymbolTool);
}
void CMapView::OnMapeditAddline()
{
m_ctrlMapX.SetCurrentTool(CUSTOM_DRAW_LINE_TOOL);
}
void CMapView::OnUpdateMapeditAddline(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ctrlMapX.GetCurrentTool()==CUSTOM_DRAW_LINE_TOOL);
}
void CMapView::OnMapeditAddpolygon()
{
m_ctrlMapX.SetCurrentTool(CUSTOM_DRAW_REGION_TOOL);
}
void CMapView::OnUpdateMapeditAddpolygon(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ctrlMapX.GetCurrentTool()==CUSTOM_DRAW_REGION_TOOL);
}
void CMapView::OnMapeditAddrect()
{
m_ctrlMapX.SetCurrentTool(CUSTOM_DRAW_RECT_TOOL);
}
void CMapView::OnUpdateMapeditAddrect(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ctrlMapX.GetCurrentTool()==CUSTOM_DRAW_RECT_TOOL);
}
void CMapView::OnMapeditAddepplise()
{
m_ctrlMapX.SetCurrentTool(CUSTOM_DRAW_ELLIPSE_TOOL);
}
void CMapView::OnUpdateMapeditAddepplise(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ctrlMapX.GetCurrentTool()==CUSTOM_DRAW_ELLIPSE_TOOL);
}
void CMapView::OnMapeditAddarc()
{
m_ctrlMapX.SetCurrentTool(CUSTOM_DRAW_ARC_TOOL);
}
void CMapView::OnUpdateMapeditAddarc(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ctrlMapX.GetCurrentTool()==CUSTOM_DRAW_ARC_TOOL);
}
void CMapView::OnInitialUpdate()
{
CView::OnInitialUpdate();
CMainFrame* pFrame=((CMainFrame*)AfxGetMainWnd());
pFrame->m_pMapView=this;
}
void CMapView::OnDestroy()
{
ClearAllTarget();
CView::OnDestroy();
CMainFrame* pFrame=((CMainFrame*)AfxGetMainWnd());
pFrame->m_pMapView=NULL;
}
void CMapView::OnAddTarget()
{
m_ctrlMapX.SetCurrentTool(GPS_ADDTARGET);
}
void CMapView::OnUpdateAddTarget(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ctrlMapX.GetCurrentTool()==GPS_ADDTARGET);
}
void CMapView::OnEditTarget()
{
m_ctrlMapX.SetCurrentTool(GPS_EDITTARGET);
}
void CMapView::OnUpdateEditTarget(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ctrlMapX.GetCurrentTool()==GPS_EDITTARGET);
}
void CMapView::OnStartGps()
{
SetTimer(100,1500,NULL);
m_bIsStartGps=TRUE;
//SetAnimationLayer();
}
void CMapView::OnUpdateStartGps(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!m_bIsStartGps);
}
void CMapView::OnEndGps()
{
KillTimer(100);
m_bIsStartGps=FALSE;
}
void CMapView::OnUpdateEndGps(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bIsStartGps);
}
//鼠标操作
void CMapView::OnMouseDownMap(short Button, short Shift, float X, float Y)
{
if(Button==1){
m_nGpsOperation=m_ctrlMapX.GetCurrentTool();
switch(m_nGpsOperation)
{
case GPS_ADDTARGET:{
double lonX,latY;
m_ctrlMapX.ConvertCoord(&X,&Y,&lonX,&latY,miScreenToMap);
//gpsTarget.SetStartXY(lonX,latY);
m_pTarget=new CGpsSet;
m_pTarget->SetStartXY(lonX,latY);
CTargetSet dlg(*m_pTarget);
if(dlg.DoModal()==IDOK)
dlg.GetGpsData(*m_pTarget);
else return;
if(!FindLayer("gps"))
m_ctrlMapX.GetLayers().Add("gps.tab");
CMapXLayer layer;
if(FindLayer("gps",layer))
{
m_pTarget->AddFeature(&m_ctrlMapX,layer);
gpsTargetArray.AddTarget(m_pTarget);
}
else
{
MessageBox("不能发现移动图层");
}
}break;
case GPS_EDITTARGET:
{
gpsTargetArray.SetActiveTarget(gpsTargetArray.HitTest(X, Y,&m_ctrlMapX));
if(gpsTargetArray.m_pActiveTarget==NULL) return;
CTargetSet dlg(*gpsTargetArray.m_pActiveTarget);
if(dlg.DoModal()==IDOK)
dlg.GetGpsData(*gpsTargetArray.m_pActiveTarget);
else return;
}break;
}
}
}
BOOL CMapView::OnMouseUpInMap(short Button, short Shift, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y)
{
return TRUE;
}
// you could use this to display the lat/long values on the status bar
BOOL CMapView::OnMouseMoveInMap(short Button, short Shift, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y)
{
return TRUE;
}
//选择目标样式
void CMapView::OnGpsChangesymbol()
{
if(!FindLayer("gps"))
m_ctrlMapX.GetLayers().Add("gps.tab");
CMapXLayer layer;
if(FindLayer("gps",layer))
{
CMapXStyle style=layer.GetStyle();
style.PickSymbol();
layer.SetStyle(style.m_lpDispatch);
}
else
{
MessageBox("不能发现移动图层");
}
}
void CMapView::OnUpdateGpsChangesymbol(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CMapView::OnTimer(UINT nIDEvent)
{
gpsTargetArray.Run();
UpdateSense();
CView::OnTimer(nIDEvent);
}
void CMapView::UpdateSense()
{
CMapXLayer layer;
if(FindLayer("gps",layer))
gpsTargetArray.UpdateGraph(layer);
layer.Refresh();
}
void CMapView::SetAnimationLayer()
{
if(!FindLayer("gps"))
m_ctrlMapX.GetLayers().Add("gps.tab");
CMapXLayer layer;
if(FindLayer("gps",layer))
m_ctrlMapX.GetLayers().SetAnimationLayer(layer.m_lpDispatch);
}
void CMapView::ClearAllTarget()
{
CMapXLayer layer;
if(FindLayer("gps",layer))
{
CMapXFeatures features=layer.AllFeatures();
for(int i=1;i<=features.GetCount();i++)
layer.DeleteFeature(features.Item(i));
gpsTargetArray.DeleteAllTarget();
}
}
BOOL CMapView::DestroyWindow()
{
return CView::DestroyWindow();
}
void CMapView::OnChangeSymbol()
{
m_bIsAutoLable=!m_bIsAutoLable;
CMapXLayer layer;
if(FindLayer("gps",layer))
{
/* CString str1=m_strEditLayer;
CMapXDataset dataSet;
if(!IsInDataSet(m_strEditLayer))
dataSet=m_pCtrlMapX->GetDatasets().Add(miDataSetLayer, vtLayer, str1);*/
layer.SetAutoLabel(m_bIsAutoLable);
}
}
void CMapView::OnUpdateChangeSymbol(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bIsAutoLable);
}
void CMapView::OnLineChange()
{
CMapXStyle style=m_ctrlMapX.GetDefaultStyle();
style.PickLine();
}
void CMapView::OnReagionChange()
{
CMapXStyle style=m_ctrlMapX.GetDefaultStyle();
style.PickRegion();
}
void CMapView::OnMapxProperty()
{
m_ctrlMapX.PropertyPage();
}
void CMapView::OnDatabindNormal()
{
try {
CMapXLayer layer = m_ctrlMapX.GetLayers().Item("USA");
VARIANT vtLayer;
vtLayer.vt = VT_DISPATCH;
vtLayer.pdispVal = layer.m_lpDispatch;
CMapXDataset dataSet = m_ctrlMapX.GetDatasets().Add(miDataSetLayer, vtLayer, "USA Layer");
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CMapView::OnUpdateDatabindNormal(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CMapView::OnBinddataOdbc()
{
// TODO: Add your command handler code here
}
void CMapView::OnUpdateBinddataOdbc(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CMapView::OnBinddataArray()
{
// TODO: Add your command handler code here
}
void CMapView::OnUpdateBinddataArray(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CMapView::OnBinddataNobind()
{
// TODO: Add your command handler code here
}
void CMapView::OnUpdateBinddataNobind(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CMapView::OnThemeReange()
{
VARIANT Type;
VARIANT Name;
VARIANT Field;
VARIANT Item;
// long FieldNums =4; // theme field numbers
long FieldNums[3] = { 3, 4, 5}; // theme field numbers
int n=3;
// construct a safearray of column numbers (could use names instead)
/*SAFEARRAY FAR* psa=NULL;
SAFEARRAYBOUND rgsabound[1];
long ix;
rgsabound[0].lLbound = 1;
rgsabound[0].cElements = n;
psa = SafeArrayCreate(VT_I4, 1, rgsabound);
if(psa == NULL){
return;
}
for (int i=0; i< n; i++) {
ix=i+1;
SafeArrayPutElement(psa, &ix, &FieldNums[i]);
}*/
// put array in field param
Field.vt = /*VT_ARRAY |*/ VT_I4;
//Field.parray = psa;
Field.lVal = 5;
Type.vt = VT_I4;
Type.lVal = miThemeRanged; //auto choose theme type
Name.vt = VT_ERROR; // use default name
Name.scode = DISP_E_PARAMNOTFOUND;
//miThemeRanged = 0,
//miThemeBarChart = 1,
//miThemePieChart = 2,
//miThemeGradSymbol = 3,
//miThemeDotDensity = 4,
//miThemeIndividualValue = 5,
//miThemeAuto = 6,
//miThemeNone = 9,
try {
// get themes collection
CMapXThemes objThemes = m_ctrlMapX.GetDatasets()[1L].GetThemes();
// want to see full legend
m_ctrlMapX.SetPreferCompactLegends(FALSE);
// add theme - will be visible by default
CMapXTheme thm = objThemes.Add(Type, Field, Name);
thm.ThemeDlg();
//CMapXThemeProperties themeDlg=thm.GetThemeProperties();
//CMapXRangeCategories cate=themeDlg.GetRangeCategories();
//cate.GetProperty();
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CMapView::OnUpdateThemeReange(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CMapView::OnThemeDot()
{
// TODO: Add your command handler code here
}
void CMapView::OnUpdateThemeDot(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CMapView::OnThemePie()
{
// TODO: Add your command handler code here
}
void CMapView::OnUpdateThemePie(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CMapView::OnThemeSymbol()
{
// TODO: Add your command handler code here
}
void CMapView::OnUpdateThemeSymbol(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CMapView::OnThemeIndiv()
{
// TODO: Add your command handler code here
}
void CMapView::OnUpdateThemeIndiv(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CMapView::OnThemeBar()
{
VARIANT Type;
VARIANT Name;
VARIANT Field;
VARIANT Item;
long FieldNums[3] = { 4, 5, 6}; // theme field numbers
int n=3;
Type.vt = VT_I4;
Type.lVal = miThemeBarChart; //auto choose theme type
Name.vt = VT_ERROR; // use default name
Name.scode = DISP_E_PARAMNOTFOUND;
Item.vt = VT_I4; // for getting first dataset
Item.lVal = 1;
// construct a safearray of column numbers (could use names instead)
SAFEARRAY FAR* psa=NULL;
SAFEARRAYBOUND rgsabound[1];
long ix;
rgsabound[0].lLbound = 1;
rgsabound[0].cElements = n;
psa = SafeArrayCreate(VT_I4, 1, rgsabound);
if(psa == NULL){
return;
}
for (int i=0; i< n; i++) {
ix=i+1;
SafeArrayPutElement(psa, &ix, &FieldNums[i]);
}
// put array in field param
Field.vt = VT_ARRAY | VT_I4;
Field.parray = psa;
try {
// get themes collection
CMapXThemes objThemes = m_ctrlMapX.GetDatasets()[1L].GetThemes();
// want to see full legend
m_ctrlMapX.SetPreferCompactLegends(FALSE);
// add theme - will be visible by default
CMapXTheme thm = objThemes.Add(Type, Field, Name);
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
// clean up fields array
if (psa)
SafeArrayDestroy(psa);
}
void CMapView::OnUpdateThemeBar(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}