http://www.gissky.net- GIS空间站

我要投稿 投稿指南 RSS订阅 网站资讯通告:
搜索: 您现在的位置: GIS空间站 >> 技术专栏 >> ArcGIS >> ArcObjects开发 >> 正文

AO开发笔记(实战篇)-用VC+AO开发独立的应用程序(2)续

作者:Snoopy    文章来源:中国3S网站(httpwww.863s.com)    点击数:    更新时间:2006-12-11
摘要:

在鼠标事件函数中添加如下代码(红色部分):

void CAOExStep1View::OnonMouseDownMapcontrol1(long button, long shift, long x, long y, double mapX, double mapY)

{

     if(1 == button) // 鼠标左键按下

     {

         IActiveViewPtr ipActiveView;

         HRESULT hr=m_ipMapControl->get_ActiveView(&ipActiveView);

         if (ipActiveView == NULL) return ;

         switch(m_ARTool)

         {

         case esriARToolNoneSelected:

         {

                 break;

         }

         case esriARToolMapZoomIn: // 地图放大

         {

               IEnvelopePtr ipEnvelope;

               hr = ipActiveView->get_Extent(&ipEnvelope);

               if (FAILED(hr)) return ;

               hr = m_ipMapControl->TrackRectangle(&ipEnvelope);

               if (FAILED(hr)) return ;

               if(ipEnvelope == NULL) return ;

              double XMin,YMin,XMax,YMax;

              XMin=YMin=XMax=YMax=0.0;

               if(S_OK !=ipEnvelope->get_XMin(&XMin)) XMin = 0.0;

               if(S_OK !=ipEnvelope->get_YMin(&YMin)) YMin = 0.0;

               if(S_OK !=ipEnvelope->get_XMax(&XMax)) XMax = 0.0;

               if(S_OK !=ipEnvelope->get_YMax(&YMax)) YMax = 0.0;

               if(XMin!=XMax&&YMin!=YMax)           // 用户拉框选择区域放大

               {

                     ipActiveView->put_Extent(ipEnvelope);

                     ipActiveView->Refresh();

               }

               else       // 用户点击进行放大

                  {

                     ipActiveView->get_Extent(&ipEnvelope);

                     if (FAILED(hr)) return ;

                     IPointPtr ipPoint(CLSID_Point);

                     ipPoint->put_X(mapX);

                     ipPoint->put_Y(mapY);

                      // 设置中心点为用户点击为主

                      ipEnvelope->CenterAt(ipPoint);

                      ipEnvelope->Expand(0.5, 0.5, true);

                      ipActiveView->put_Extent(ipEnvelope);

                      ipActiveView->Refresh();

                 }

           }

           break;

           case esriARToolMapZoomOut: // 地图缩小

           {

                 IEnvelopePtr ipEnvelope;

                 hr = ipActiveView->get_Extent(&ipEnvelope);

                 if (FAILED(hr)) return ;

                 IPointPtr ipPoint(CLSID_Point);

                 ipPoint->put_X(mapX);

                 ipPoint->put_Y(mapY);

                 ipEnvelope->CenterAt(ipPoint);

                 // 设置中心点为用户点击为主

                 ipEnvelope->Expand(2, 2, true);

                 ipActiveView->put_Extent(ipEnvelope);

                 ipActiveView->Refresh();

              }

              break;

              case esriARToolMapPan: // 地图平移

              {

                     m_ipMapControl->Pan();

               }

               break;

               default:

                             break;

               }

     }         

}

为工具栏前四个按钮添加UPDATE_COMMAND_UI更新函数,代码如下:

//////////////////////////////////////////////////////////////////////////

// 更新工具栏

void CAOExStep1View::OnUpdateMapArrow(CCmdUI* pCmdUI)

{

     pCmdUI->SetCheck(m_ARTool == esriARToolNoneSelected);

} 

void CAOExStep1View::OnUpdateMapPan(CCmdUI* pCmdUI)

{

     pCmdUI->SetCheck(m_ARTool == esriARToolMapPan);

} 

void CAOExStep1View::OnUpdateMapZoomin(CCmdUI* pCmdUI)

{

     pCmdUI->SetCheck(m_ARTool == esriARToolMapZoomIn);

} 

void CAOExStep1View::OnUpdateMapZoomout(CCmdUI* pCmdUI)

{

     pCmdUI->SetCheck(m_ARTool == esriARToolMapZoomOut);

}

保存修改,编译程序。运行就可以对地图进行放大、缩小、平移、显示全图的操作了(如下图)。

三、本章小结

上面我们添加了地图漫游的功能,并使地图窗口随框架窗口一起缩放。你可能发现我们的程序加载的地图是在设置MapControl控件属性时指定的。我们在下一节中将实现从shp文件加载地图,并实现图层管理的一些功能

Tags:AO开发  
责任编辑:gissky
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 中国地图