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

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

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

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

在上一节中我们实现了一个简单的显示地图的程序。下面我们在它的基础上完善和添加以下新的功能:

1.当框架窗口大小更改时改变地图控件窗口使之随框架窗口增大。

2.增加地图漫游功能:移动、放大、缩小、显示全图 

一、更改项目配置、添加引入库代码

    在本节中我们将使用AO提供的一些接口,所以需要更改项目配置,以及添加引用AO库的代码。

    首先打开上一节所建项目。选择菜单Tools->Options->Directories页在Include files里添加两个路径(如果你的ArcGIS的安装目录在其它盘,需做相应改动):

C:\PROGRAM FILES\ARCGIS\COM

C:\PROGRAM FILES\ARCGIS\BIN

     在项目的StdAfx.h中添加如下代码:

// AO引入库

#pragma warning(push)

#pragma warning(disable: 4192)

#pragma warning(disable: 4146)

#import "esriSystem.olb" raw_interfaces_only raw_native_types no_namespace named_guids exclude("OLE_COLOR", "OLE_HANDLE", "VARTYPE", "IStatusBar")

#import "esriSystemUI.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids exclude("IProgressDialog")

#import "esriGeometry.olb" raw_interfaces_only raw_native_types no_namespace named_guids

#import "esriDisplay.olb" raw_interfaces_only raw_native_types no_namespace named_guids

#import "esriGeoDatabase.olb" raw_interfaces_only raw_native_types no_namespace named_guids

#import "esriCarto.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids

#import "esriDataSourcesFile.olb" raw_interfaces_only raw_native_types no_namespace named_guids exclude("OLE_COLOR", "OLE_HANDLE")

#import "esriDataSourcesGDB.olb" raw_interfaces_only raw_native_types no_namespace named_guids exclude("OLE_COLOR", "OLE_HANDLE")

#import "ToolbarControl.ocx" raw_interfaces_only raw_native_types no_namespace named_guids

#import "TOCControl.ocx" raw_interfaces_only raw_native_types no_namespace named_guids

#import "MapControl.ocx" raw_interfaces_only raw_native_types no_namespace named_guids

#import "PageLayoutControl.ocx" raw_interfaces_only raw_native_types no_namespace named_guids

#import "ArcReaderControl.ocx" raw_interfaces_only raw_native_types no_namespace named_guids

#pragma warning(pop)

二、添加地图浏览功能,完善地图窗口缩放

            1、使MapControl随窗口放大

首先为CAOExStep1View添加一个保护类型的成员变量:

IMapControl3Ptr m_ipMapControl;   // 地图控件

该变量保存指向MapContrl的接口指针。然后在类CAOExStep1View的成员函数OnInitialUpdate添加如下代码初始化它(红色部分):

void CAOExStep1View::OnInitialUpdate()

{

     …// 此处省略其它代码

     // 获取MapControl指针

     m_ipMapControl = GetDlgItem(IDC_MAPCONTROL1)->GetControlUnknown();

}

为类CAOExStep1View添加窗口改变大小事件函数,并在里面添加如下代码(红色部分):

void CAOExStep1View::OnSize(UINT nType, int cx, int cy)

{

     CFormView::OnSize(nType, cx, cy);

     // View窗口改变大小时改变MapControl大小

     if(m_ipMapControl!=NULL)

     {

                 CRect rc;

                 GetClientRect(rc);

                 GetDlgItem(IDC_MAPCONTROL1)->MoveWindow(rc);

     }

}

     经过上面的修改,现在重新编译程序,把窗口最大化,你会看到地图窗口随之放大。

2、接下来我们来添加地图漫游功能

     首先把项目默认的工具栏按钮全部删除只留下关于按钮。然后添加5个按钮,按钮ID和提示文本如下,按钮的图标可以使用ArcGIS的相应功能的图标(ArcGIS的一些图标保存在按照目录的Bin\Icons\下面,是一系列bmp文件)。

ID_MAP_ARROW                                      "选择状态\n选择状态"

ID_MAP_PAN                                            "地图平移\n地图平移"

ID_MAP_ZOOMIN                         "地图放大\n地图放大"

ID_MAP_ZOOMOUT                                  "地图缩小\n地图缩小"

ID_MAP_FULLEXTENT                 "显示全图\n显示全图" 

     为了处理鼠标事件我们需要为MapControl添加一个onMouseDown事件函数,在类CAOExStep1View里添加上面添加的工具栏按钮的响应函数,另外我们还需要在类CAOExStep1View头文件里添加一个标志当前鼠标操作状态的成员变量:

esriARTool m_ARTool;                                // 鼠标当前状态

在工具栏响应函数中添加如下代码(红色部分):

// 选择状态

void CAOExStep1View::OnMapArrow()

{

     m_ARTool = esriARToolNoneSelected;

     m_ipMapControl->put_MousePointer(esriPointerDefault);

}

 

// 地图平移

void CAOExStep1View::OnMapPan()

{

     m_ARTool = esriARToolMapPan;

     m_ipMapControl->put_MousePointer(esriPointerPan);

}

// 地图放大

void CAOExStep1View::OnMapZoomin()

{

     m_ARTool = esriARToolMapZoomIn;

     m_ipMapControl->put_MousePointer(esriPointerZoomIn);

} 

// 地图缩小

void CAOExStep1View::OnMapZoomout()

{

     m_ARTool = esriARToolMapZoomOut;

     m_ipMapControl->put_MousePointer(esriPointerZoomOut);

} 

// 显示全图

void CAOExStep1View::OnMapFullextent()

{

     IActiveViewPtr ipActiveView;

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

     if (FAILED(hr)) return;

     IEnvelopePtr ipEnvelope;

     hr = ipActiveView->get_FullExtent(&ipEnvelope);

     if (FAILED(hr)) return;

     ipActiveView->put_Extent(ipEnvelope);

     ipActiveView->Refresh();

}

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

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