制作自定义工具是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); //
}