VC下鹰眼图的实现

VC下鹰眼图实现的思路与VB是一样的,只不过VC的可视化程序没有VB高,VC更多的是利用代码来实现一定的功能。如利用下面的两句代码创建两个控件,分别用来显示主图和鹰眼图。

m_ctrlMapX.Create(NULL,   WS_VISIBLE,   CRect(0,0,300,300),   this,   IDC_MAP1);

m_eagleMapx.Create(NULL,   WS_VISIBLE,   CRect(0,0,400,400),   this,IDC_MAP2);

另外在初始化程序时,还需创建一个图层,用于显示鹰眼图上矩形Feature。

m_eagleMapx.GetLayers().CreateLayer( "RectLayer ");

鹰眼图的主要功能是在主图发生变化时,在鹰眼图上用变化的矩形框来显示当前主图显示的边界。这里主要利用MapX   控件内置的消息MAPX_DISPID_MAPVIEWCHANGED映射的函数来完成该功能,当主视图发生变化时,MapX   控件发出消息,调用OnMapViewChanged()函数进行相应的处理,所以主要的代码在OnMapViewChanged()函数中实现。

ON_EVENT(CMapXSampleView,   IDC_MAP1,   MAPX_DISPID_MAPVIEWCHANGED,   OnMapViewChanged,   VTS_NONE)

 

//主视图发生变化时,调用如下的函数
void   CMapXSampleView::OnMapViewChanged()  
{

              double   X1,Y1,X2,Y2;                                                                             //声明坐标变量 
              double   x2,y2,x4,y4;                                                               //声明坐标变量 
        VARIANT   scx,   scy,   scx1,   scy1;                                                       //声明屏幕坐标变量 
                VARIANT   mapx1,mapy1,mapx2,mapy2;                       //声明地图坐标变量

        //声明FeatureFactory变量并获取缺省值 
              CMapXFeatureFactory   cFactory=m_eagleMapx.GetFeatureFactory(); 
              CMapXLayer     layer;                                                                         //声明图层变量 
              CMapXFeature   feature;                                                         //声明Feature变量 
              CMapXFeatures   features;                                                                   //声明Features变量 
              CMapXPoints   points;                                                                         //声明Points变量 
              points.CreateDispatch(points.GetClsid()); 


              CMapXRectangle   rect;                                                                       //声明矩形变量 
              rect.CreateDispatch(rect.GetClsid()); 


              //获取主图的边界,根据这个边界值,在鹰眼图上添加一个矩形Feature 
            rect   =   m_ctrlMapX.GetBounds(); 
              X1   =   rect.GetXMin();                                                                           //获得矩形左上顶点x坐标 
              Y1   =   rect.GetYMin();                                                                           //获得矩形左上顶点y坐标 
              X2   =   rect.GetXMax();                                                           //获得矩形右下顶点x坐标 
              Y2   =   rect.GetYMax();                                                           //获得矩形右下顶点y坐标

 

                //进行坐标变换 
              m_eagleMapx.ConvertCoordV(&scx,&scy,COleVariant(X1),COleVariant(Y1),miMapToScreen); 
              m_eagleMapx.ConvertCoordV(&scx1,&scy1,COleVariant(X2),COleVariant(Y2),miMapToScreen); 
              m_eagleMapx.ConvertCoordV(&scx,&scy1,&mapx1,&mapy1,miScreenToMap); 
              m_eagleMapx.ConvertCoordV(&scx1,&scy,&mapx2,&mapy2,miScreenToMap);

                                                       

             //获得矩形框顶点坐标 
              x2=   mapx1.dblVal;                                                       
              y2=mapy1.dblVal; 
              x4=mapx2.dblVal; 
              y4=mapy2.dblVal; 

              //得到添加矩形Feature的图层 
              layer=m_eagleMapx.GetLayers().Item( "RectLayer "); 
              features=layer.AllFeatures();

              //没有添加矩形Feature的图层,则新建 
              if(features.GetCount()   ==   0) 
              { 
                            //添加四个顶点构成一个矩形框

                            points.AddXY(X1,Y1);                                                                                 //添加顶点1 
                            points.AddXY(x2,y2);                                                                                     //添加顶点2 
                            points.AddXY(X2,Y2);                                                                                  //添加顶点3 
                            points.AddXY(x4,y4);                                                                                   //添加顶点4

//创建矩形Feature

                            COleVariant   vtPoints; 
                            vtPoints.vt   =   VT_DISPATCH; 
                            vtPoints.pdispVal   =   points.m_lpDispatch; 
                            vtPoints.pdispVal-> AddRef(); 
                            feature=cFactory.CreateRegion(vtPoints);  

                            //设置矩形Feature的属性

                           CMapXStyle   style=feature.GetStyle();

                            style.SetRegionPattern(miPatternNoFill);                                 //设置矩形的填充方式 
                            style.SetRegionBorderColor(miColorRed);                                 //设置矩形边框颜色 
                            style.SetRegionBorderWidth(2);                                                   //设置矩形边框宽度 
                            feature.SetStyle(style.m_lpDispatch); 
                            //添加已经创建的矩形Feature 
                            m_eaglefeature   =   layer.AddFeature(feature); 
              }

              else           //否则更新Feature的矩形大小与位置 
              { 
                            m_eaglefeature.GetParts().Item(1).RemoveAll();                         //除去已有的顶点 
                            m_eaglefeature.GetParts().Item(1).AddXY(X1,Y1);                 //添加顶点1 
                            m_eaglefeature.GetParts().Item(1).AddXY(x2,y2);                           //添加顶点2 
                            m_eaglefeature.GetParts().Item(1).AddXY(X2,Y2);                       //添加顶点3 
                            m_eaglefeature.GetParts().Item(1).AddXY(x4,y4);                           //添加顶点4 
                            m_eaglefeature.Update();                                                                  //更新Feature属性 
              }

              //更新显示图层 
              layer.Refresh();
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值