7.7.4 测距的实现

2013-10-07 14:54:23 · 作者: · 浏览: 61

7.7.4  测距的实现

当用户在地图上按下两点后,可以获得这两点的屏幕坐标,将该屏幕坐标转换成地理坐标,再计算这两点间的距离。该功能的实现同样是用上方工具栏中的按钮来完成的。测距按钮的消息响应是在视图类中添加的,对应函数OnMeasure代码如下:

代码位置:见光盘中本章源代码的CMapPublicView类。

  1. 1  void CMapPublicView::OnMeasure()  
  2. 2  {  
  3. 3   PlayResource(IDR_WAVE2);                            //播放声音资源  
  4. 4      m_Map.SetMousePointer(moArrow);                  //设置鼠标指针形状为箭头  
  5. 5       m_CurrentOperation=GetDisP1toP2;                //设置当前的操作  
  6. 6   if(!m_startPoint.CreateDispatch("MapObjects2.Point"))//控件支持自动化  
  7. 7       return ;  
  8. 8   if(!m_endPoint.CreateDispatch("MapObjects2.Point"))  
  9. 9       return ;  
  10. 10      m_mouseDownNum=0;  
  11. 11  }  

第3行代码为播放声音资源。

第4行代码为设置鼠标指针的形状为箭头。

第5行代码为设置当前的操作状态。GetDisP1toP2表示操作类型为测量距离。

第6~9行代码实现控件支持自动化。

要想实现两点间距离的测量还需要一个重要的函数OnDblClickMap1(),这个函数是MapObjects控件的DblClick消息响应函数。代码如下:

代码位置:见光盘中本章源代码的CMapPublicView类。

  1. 1  void CMapPublicView::OnDblClickMap1()  
  2. 2  {  
  3. 3      if(m_CurrentOperation==GetDisP1toP2)                 //判断当前的操作  
  4. 4   {  
  5. 5       double distance;                                    //定义距离变量  
  6. 6       CString str="";                                 //定义字符串变量  
  7. 7       MPoint pt[2];  
  8. 8       pt[0].x=m_startPoint.GetX();                        //获取点的坐标  
  9. 9       pt[0].y=m_startPoint.GetY();  
  10. 10          pt[1].x=m_endPoint.GetX();  
  11. 11          pt[1].y=m_startPoint.GetY();  
  12. 12          distance=(int)Info.CalcLenght(pt,2);            //获取两点的距离  
  13. 13          str.Format("%.2f",distance);  
  14. 14          str="两点间距离约为:"+str+"米";  
  15. 15          CMainFrame *pFrame=(CMainFrame *)AfxGetMainWnd();//获取主框架的指针  
  16. 16          CAttribute *pView=(CAttribute *)(pFrame->m_wndSplitter2.GetPane(1,0));  
  17. 17          pView->m_strAttribute=str;  
  18. 18          pView->UpdateData(false);  
  19. 19          m_mouseDownNum=0;  
  20. 20          m_startPoint.ReleaseDispatch();             //释放  
  21. 21          m_endPoint.ReleaseDispatch();  
  22. 22      }  
  23. 23  }  

第8~11行代码为获取起点和终点的位置。

第12~14行代码为获取两点间的距离,并将距离格式化到字符串中。

第15~18行代码为将距离显示在状态栏中。

上述代码首先判断当前用户的操作是否为测距,pt数组保存了鼠标在两个点的坐标,当双击时,就会在右侧的编辑框中显示这两个点的距离。