在上一节中我们实现了一个简单的显示地图的程序。下面我们在它的基础上完善和添加以下新的功能:
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)续。