7.7.4 测距的实现
当用户在地图上按下两点后,可以获得这两点的屏幕坐标,将该屏幕坐标转换成地理坐标,再计算这两点间的距离。该功能的实现同样是用上方工具栏中的按钮来完成的。测距按钮的消息响应是在视图类中添加的,对应函数OnMeasure代码如下:
代码位置:见光盘中本章源代码的CMapPublicView类。
- 1 void CMapPublicView::OnMeasure()
- 2 {
- 3 PlayResource(IDR_WAVE2); //播放声音资源
- 4 m_Map.SetMousePointer(moArrow); //设置鼠标指针形状为箭头
- 5 m_CurrentOperation=GetDisP1toP2; //设置当前的操作
- 6 if(!m_startPoint.CreateDispatch("MapObjects2.Point"))//控件支持自动化
- 7 return ;
- 8 if(!m_endPoint.CreateDispatch("MapObjects2.Point"))
- 9 return ;
- 10 m_mouseDownNum=0;
- 11 }
第3行代码为播放声音资源。
第4行代码为设置鼠标指针的形状为箭头。
第5行代码为设置当前的操作状态。GetDisP1toP2表示操作类型为测量距离。
第6~9行代码实现控件支持自动化。
要想实现两点间距离的测量还需要一个重要的函数OnDblClickMap1(),这个函数是MapObjects控件的DblClick消息响应函数。代码如下:
代码位置:见光盘中本章源代码的CMapPublicView类。
- 1 void CMapPublicView::OnDblClickMap1()
- 2 {
- 3 if(m_CurrentOperation==GetDisP1toP2) //判断当前的操作
- 4 {
- 5 double distance; //定义距离变量
- 6 CString str=""; //定义字符串变量
- 7 MPoint pt[2];
- 8 pt[0].x=m_startPoint.GetX(); //获取点的坐标
- 9 pt[0].y=m_startPoint.GetY();
- 10 pt[1].x=m_endPoint.GetX();
- 11 pt[1].y=m_startPoint.GetY();
- 12 distance=(int)Info.CalcLenght(pt,2); //获取两点的距离
- 13 str.Format("%.2f",distance);
- 14 str="两点间距离约为:"+str+"米";
- 15 CMainFrame *pFrame=(CMainFrame *)AfxGetMainWnd();//获取主框架的指针
- 16 CAttribute *pView=(CAttribute *)(pFrame->m_wndSplitter2.GetPane(1,0));
- 17 pView->m_strAttribute=str;
- 18 pView->UpdateData(false);
- 19 m_mouseDownNum=0;
- 20 m_startPoint.ReleaseDispatch(); //释放
- 21 m_endPoint.ReleaseDispatch();
- 22 }
- 23 }
第8~11行代码为获取起点和终点的位置。
第12~14行代码为获取两点间的距离,并将距离格式化到字符串中。
第15~18行代码为将距离显示在状态栏中。
上述代码首先判断当前用户的操作是否为测距,pt数组保存了鼠标在两个点的坐标,当双击时,就会在右侧的编辑框中显示这两个点的距离。