申明:
本人在網上找了很多例子,就這個比較完整,經過調試無誤,遂貼出來供大家參考,讓大家少走彎路(注意要先載入地圖)。
參考部落格:http://blog.csdn.net/fengrx/archive/2009/05/09/4163187.aspx
以下文章前部分是原文作者的,後部分是本人結合具體細節添加的,也算是對原文的一個完善。
製作自訂工具是MapX編程中一個很重要的部分,其步驟比較簡單,但很多人很容易忽略其中的部分步驟,使得此功能難以實現。具體可以按以下步驟來做,本人在做這一功能時花費時間頗多,因為大部分介紹這一功能的文章都忽略了其中第三步驟,使得初學者很難成功實現。
故在原來基礎上加以完善,使得步驟更加詳細。其他自訂工具可以按照類似步驟來做。
//1.定義常量
#define MYTOOL_DISTANCE 100 //1~999
//2.建立工具
m_ctrlMap.CreateCustomTool(MYTOOL_DISTANCE,miToolTypePoly,miCrossCursor);
//3.建立事件槽
在View.h中,在DECLARE_MESSAGE_MAP()行下邊加入一行代碼:DECLARE_EVENTSINK_MAP()
在View.cpp中,加入
BEGIN_EVENTSINK_MAP(CPatrolCheckView, CView)
ON_EVENT(CPatrolCheckView, IDC_MAP,
11/*MAPX_DISPID_POLYTOOLUSED*/, OnPolyToolUsedMap,
VTS_I2 VTS_I4 VTS_DISPATCH VTS_BOOL VTS_BOOL VTS_PBOOL)
END_EVENTSINK_MAP()
//4.響應事件
在View.h中添加 void OnPolyToolUsedMap(short ToolNum, long Flags, LPDISPATCH Points,BOOL
bShift,BOOL bCtrl,BOOL FAR* EnableDefault);
在View.cpp中,加入實現代碼
void CMapXSampleView::OnPolyToolUsedMap(short ToolNum, long Flags, LPDISPATCH Points,
BOOL bShift,BOOL bCtrl,BOOL FAR* EnableDefault)
{
//計算距離
if(Flags==miPolyToolInProgress) {//這句可有可無
if(ToolNum==MYTOOL_DISTANCE)
{
CMapXPoints pts;
long n;
long i;
try{
pts.AttachDispatch (Points, FALSE); // Get points Object
double dDistanceTot=0.0;
n=pts.GetCount ();
m_ctrlMapX.SetMapUnit(miUnitKilometer);
for (i=1; i<n;i++)
{
CMapXPoint pt1=pts.Item(i);
CMapXPoint pt2=pts.Item(i+1);
double d=m_ctrlMapX.Distance (pt1.GetX(),pt1.GetY(),pt2.GetX (),
pt2.GetY ());
dDistanceTot+=d;
}
CString str;
str.Format ("總距離為:%f",dDistanceTot);
//在狀態列輸出距離
((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(0,str); //要先將m_wndStatusBar設
為public
}
catch (COleDispatchException *e){
e->ReportError ();
e->Delete ();
}
catch (COleException *e){
e->ReportError ();
e->Delete ();
}
}
}//if(Flags==miPolyToolInProgress)
}
//5.調用工具
void CMapXSampleView::OnMapToolDistancetool()
{
m_ctrlMapX.SetCurrentTool(MYTOOL_DISTANCE); //
}
注意:ON_EVENT(CPatrolCheckView, IDC_MAP, 11/*MAPX_DISPID_POLYTOOLUSED*/, OnPolyToolUsedMap, 中標紅的地方,具體工具類型的判斷在OnPolyToolUsedMap中進行
以上部分參考:CSDN部落格,轉載請標明出處:http://blog.csdn.net/fengrx/archive/2009/05/09/4163187.aspx
下面是我完整的代碼:
// TestTView.h : interface of the CTestTView class///////////////////////////////////////////////////////////////////////////////#if !defined(AFX_TESTTVIEW_H__605D4332_7071_4CE3_9EFE_73D15BB50061__INCLUDED_)#define AFX_TESTTVIEW_H__605D4332_7071_4CE3_9EFE_73D15BB50061__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include "MapX.h"#include "MainFrm.h"class CTestTView : public CView{protected: // create from serialization onlyCTestTView();DECLARE_DYNCREATE(CTestTView)// Attributespublic:CTestTDoc* GetDocument();// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CTestTView)public:virtual void OnDraw(CDC* pDC); // overridden to draw this viewvirtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected:virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);//}}AFX_VIRTUAL// Implementationpublic:BOOL OnToolTest();void OnPolyToolUsedMap(short ToolNum, long Flags, LPDISPATCH Points,BOOL bShift,BOOL bCtrl,BOOL FAR* EnableDefault);virtual ~CTestTView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:private:CMapX m_ctrlMapX;// Generated message map functionsprotected://{{AFX_MSG(CTestTView)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnTest();afx_msg void OnSize(UINT nType, int cx, int cy);//}}AFX_MSGDECLARE_MESSAGE_MAP()DECLARE_EVENTSINK_MAP()};#ifndef _DEBUG // debug version in TestTView.cppinline CTestTDoc* CTestTView::GetDocument() { return (CTestTDoc*)m_pDocument; }#endif///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_TESTTVIEW_H__605D4332_7071_4CE3_9EFE_73D15BB50061__INCLUDED_)
// TestTView.cpp : implementation of the CTestTView class//#include "stdafx.h"#include "TestT.h"#include "TestTDoc.h"#include "TestTView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CTestTViewIMPLEMENT_DYNCREATE(CTestTView, CView)BEGIN_MESSAGE_MAP(CTestTView, CView)//{{AFX_MSG_MAP(CTestTView)ON_WM_CREATE()ON_COMMAND(ID_TEST, OnTest)ON_WM_SIZE()//}}AFX_MSG_MAP// Standard printing commandsON_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(CTestTView,CView)ON_EVENT(CTestTView,IDC_MAP,MAPX_DISPID_POLYTOOLUSED,OnPolyToolUsedMap,VTS_I2 VTS_I4 VTS_DISPATCH VTS_BOOL VTS_BOOL VTS_PBOOL)END_EVENTSINK_MAP()// CTestTView construction/destructionCTestTView::CTestTView(){// TODO: add construction code here}CTestTView::~CTestTView(){}BOOL CTestTView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////////////// CTestTView drawingvoid CTestTView::OnDraw(CDC* pDC){CTestTDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here}/////////////////////////////////////////////////////////////////////////////// CTestTView printingBOOL CTestTView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CTestTView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CTestTView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////////////// CTestTView diagnostics#ifdef _DEBUGvoid CTestTView::AssertValid() const{CView::AssertValid();}void CTestTView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CTestTDoc* CTestTView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestTDoc)));return (CTestTDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CTestTView message handlersint CTestTView::OnCreate(LPCREATESTRUCT lpCreateStruct) {if(!m_ctrlMapX.Create(NULL,WS_VISIBLE,CRect(0,0,100,100),this,IDC_MAP))return -1;m_ctrlMapX.SetGeoSet("CHINA.GST");m_ctrlMapX.SetTitleText("");//建立自訂工具m_ctrlMapX.CreateCustomTool(DRAG_TOOL,miToolTypePoly,miCrossCursor);// TODO: Add your specialized creation code here miSizeAllCursorif (CView::OnCreate(lpCreateStruct) == -1)return -1;return 0;}void CTestTView::OnPolyToolUsedMap(short ToolNum, long Flags, LPDISPATCH Points,BOOL bShift,BOOL bCtrl,BOOL FAR* EnableDefault){((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(0,"開始計算");//計算距離//if(Flags==miPolyToolInProgress) {//這句可有可無if(ToolNum==DRAG_TOOL){CMapXPoints pts;long n;long i;try{pts.AttachDispatch (Points, FALSE); // Get points Objectdouble dDistanceTot=0.0;n=pts.GetCount ();m_ctrlMapX.SetMapUnit(miUnitKilometer);for (i=1; i<n;i++){CMapXPoint pt1=pts.Item(i);CMapXPoint pt2=pts.Item(i+1);double d=m_ctrlMapX.Distance (pt1.GetX(),pt1.GetY(),pt2.GetX (),pt2.GetY ());dDistanceTot+=d; }CString str;str.Format ("總距離為:%f",dDistanceTot);//在狀態列輸出距離((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(0,str); //要先將m_wndStatusBar設為public}catch (COleDispatchException *e){e->ReportError ();e->Delete ();}catch (COleException *e){e->ReportError ();e->Delete ();}// }}//if(Flags==miPolyToolInProgress) }void CTestTView::OnTest() {// TODO: Add your command handler code herem_ctrlMapX.SetCurrentTool(DRAG_TOOL);((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(0,"gooooooooood");}void CTestTView::OnSize(UINT nType, int cx, int cy) {CView::OnSize(nType, cx, cy);// TODO: Add your message handler code hereif (cx!=0&&cy!=0){m_ctrlMapX.MoveWindow(0,0,cx,cy,TRUE);}}BOOL CTestTView::OnToolTest(){MessageBox("goood test");return TRUE;}