VC中使用mo的TrackingLayer显示自定义随即移动图形(从零开始)

        TrackingLayer(动态跟踪层)始终位于窗口的顶层,在TrackingLayer上,可以绘制和添加各种类型的对象,如:点、线、文本等。

在TrackinigLayer中绘制的对象不会自动保留(会立即被消除),也不会自动保存到某一个图层中,但用户可以获得该对象,并对他进行各种处理,如显示、添加到某个层中,用TrackLayer还可以实现对象闪烁,沿线跟踪等功能。

        TrackingLayer对象是地图控件中一个特殊图层,它用于描绘位置可以改变的地理对象,如全球定位系统(GPS)中的对象位置。这些对象称为事件(Event),用GeoEvent对象来表示。

        TrackingLayer对象代表地图控件中的一个图层,他显示在层集之后,并可以相对层集独立重显。GeoEvent对象代表一些TrackingLayer中的离散对象,这些对象可以用编成的方法用一个symbol对象描述,其X、Y属性可以读取GeoEvent对象的地理位置。使用Move和MoveTo方法可以移动一个GeoEven对象。

  1. 下面介绍TrackingLayer对象的属性
  •         Event属性——该属性指向TrackingLayer对象的GeoEvent列表。他通过在GeoEvent组中成员的序列号序列号,读取该位置的GeoEvent对象。
  • EventCount属性——表示TrackingLayer对象包含GeoEvent对象的个数(只读属性)。
  • Symbol属性——根据TrackingLayer中Symbol组中的对象位置,读取Symbol对象的地址指针。
  • SymbolCount属性——TL(以下TL为TrackingLayer的缩写)对象中包含的Symbol对象的数目。
  • Visible属性——控制TL图层是否显示。

     2.      TL对象的方法

  • AddEvent方法——在规定的位置上面添加一个新的GeoEvent对象,原形为:bject.AddEvent( shape, symbolIndex);                                                           ariable—— An object expression that evaluates to a GeoEvent object.
    object ——An object expression that evaluates to a TrackingLayer object.
    shape ——An object expression that evaluates to a Point, Line, Polygon, Rectangle, or Ellipse object, or a Points collection.
  • ClearEvent方法——删除Tl中所有的GeoEvent对象和相应的Symbol对象。删除一个GeoEvent对象可以使用RemoveEvent方法,而要删除所有的Symbol对象,只要将SymbolCount设置为0即可。object.ClearEvents
  • ReMoveEvent方法——删除规定的GeoEvent对象和相应的TL的符号。原形为
    object.RemoveEvent index
    bject ——An object expression that evaluates to a TrackingLayer
     object.
    index—— An integer index that indicates which GeoEvent to delete. Index must be a number from 0 to one less than the value of the EventCount property.
  • FindEvent方法——寻找满足条件的GeoEvent对象。该方法只返回第一个满足条件的GeoEvent对象。原形为:object.FindEvent (tag)
    bject—— An object expression that evaluates to a TrackingLayer
     object.
    tag ——The tag value of the GeoEvent required
  • Refresh方法——强制重画TL对象。改变GeoEvent后将引起刷新TL。只是在进行大量计算之前需要显示TL的变化时,才需要执行该方法。原形为:object.Refresh [ erase ], [ rect ]
    bject ——An object expression that evaluates to an object in the Applies To list.
    erase —— Optional Boolean expression.  Applies to a TrackingLayer object only, as explained in settings.True: MapObjects erases and redraws the entire TrackingLayer;False :MapObjects only redraws the areas of the TrackingLayer that have been made invalid by moving GeoEvent objects prior to the last redraw.
    rect ——A Rectangle object representing an area within the map extent.  If given then only this area within the TrackingLayer will be refreshed.  Applies to a TrackingLayer object only.

    3.    GeoEvent对象属性

  • Idenx属性——返回当前GeoEvent对象在TL图层中的索引位置。
  • Shape属性——返回与设置当前GeoEvent对象连接的shape对象。
  • SymbolIndex属性——返回与设置与当前GeoEvent对象连接的Symbol在TL中的索引值。
  • Tag属性——返回与设置GeoEvent对象的tag字符串。
  • X和Y属性——返回GeoEvent对象中心位置的坐标值。

    4.    GeoEvent对象方法

  • Move方法——object.Move (deltaX, deltaY)
    object ——An object expression that evaluates to a GeoEvent object.
    deltaX ——The horizontal distance in map units to move the GeoEvent relative to its original location.
    deltaY ——The vertical distance in map units to move the GeoEvent
     relative to its original location.
  • MoveTo方法——object.MoveTo (value1, value2)
    object—— An object expression that evaluates to an object in the Applies To list.
    value1—— For a Layers collection: A numeric expression that evaluates to the current index position in the collection.
     For a GeoEvent: The new horizontal location in map units of the GeoEvent.
    value2—— For a Layers collection: A numeric expression that evaluates to the target index position in the collection.

        有了以上知识,我们可以开始编写代码了。假设我们要实现的功能是:在工具栏中设置一个ID为ID_ADD的按钮,当点击后,每次鼠标点击mo控件中的任何位置,我们都可以0添加一个点(该点是非受限空间的随机移动物体),同时弹出一个显示点击位置的对话框。

        代码如下:

         1.新建一个名为:MoTest的工程。

         2.在CMoTestView类中添加如下属性:private: int  m_nCurTool;

         3.在ToolBar中添加一个按钮,ID为:ID_ADD,其相应事件为:

         void CMoTestView::OnAdd()
         {
                 // TODO: 在此添加命令处理程序代码
                 m_nCurTool = 1;
          }

        4.在MO的OnMouseMove控件中写入以下代码:

         void CMoTestView::MouseDownMap1(short Button, short Shift, long X, long Y)
         {
               // TODO: 在此处添加消息处理程序代码
              switch (m_nCurTool)
               {
                   case 1:  //生成动点
                   {
                         CMoPoint mapPt(m_map.ToMapPoint((float)X,(float)Y));
                         CString a,b;
                         a.Format("%f",mapPt.GetX());
                         b.Format("%f",mapPt.GetY());
                         AfxMessageBox(a+b);
                        CMoTrackingLayer tLayer(m_map.GetTrackingLayer());
                          tLayer.AddEvent(mapPt, 0);  //event的ID号
                   }
                     break;
              }
        }

         写成case语句的主要原因是因为,toolbar上面有很多按钮都需要用到MouseDownMap1实现其他:如放大,缩小,漫游功能,在此不详细介绍。

         5.添加一个Timer,                                                                                                      在OnInitialUpdate函数中启动SetTimer(1,1000, NULL);编辑函数:

         void CMoTestView::OnTimer(UINT nIDEvent)
        {
              // TODO: 在此添加消息处理程序代码和/或调用默认值

              CMoRectangle extent(m_map.GetExtent());
              double maxDist = extent.GetWidth()/20.0;

              CMoTrackingLayer tLayer(m_map.GetTrackingLayer());
               int eventCounter = tLayer.GetEventCount();
             CMoGeoEvent event;
             for (int i = 0; i<eventCounter; i++)
             {
                    event = tLayer.GetEvent(i);
                    double xOffset = maxDist *((double)rand()/(double)RAND_MAX - 0.5);
                     double yOffset = maxDist *((double)rand()/(double)RAND_MAX - 0.5);
                    event.Move(xOffset,yOffset);
              }

        }

        运行该程序,则实现了主题功能。

卢阳

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值