您的位置:首页 > 编程语言 > C语言/C++

ArcEngine10.2 VC++实现地图浏览基本功能

2015-01-21 19:31 796 查看
1、创建一个mfc单文档程序(我这里叫MapEx),前面可以默认,高级功能中的“ActiveX 控件(R)”必须要,在最后一步 生成的类,基类选择CFormView。2、添加MapControl控件,点击窗体IDD_MAPEX_FORM,右键选择“插入ActiveX控件(X)”,选择Esri MapControl,确认。3,、加载地图,可以通过MapControl的属性页Map Docment来加载,也可以直接在MapControl属性里面的DocumentFilename添加路径,如D:\Users\Administrator\Desktop\Usa\USA.mxd。4、在ToolBar中添加按钮 分别为ID_MAP_ZOOMIN(放大)、ID_MAP_ZOOMOUT(缩小)、  ID_MAP_PAN(漫游)、 ID_MAP_FULLEXTENT(全图)、  ID_MAP_DEFAUT(还原鼠标状态)5、在stdafx.h头文件的最下面添加如下 导入库文件 代码
#pragma warning(push)
#pragma warning(disable : 4192) /* Ignore warnings for types that are duplicated in win32 header files */
#pragma warning(disable : 4146) /* Ignore warnings for use of minus on unsigned types */
#import "libid:6FCCEDE0-179D-4D12-B586-58C88D26CA78" raw_interfaces_only no_implementation
#import "C:\Program Files (x86)\ArcGIS\Engine10.2\com\esriSystem.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, exclude("OLE_COLOR", "OLE_HANDLE", "VARTYPE") rename("min", "esriMin") rename("max", "esriMax")
#import "C:\Program Files (x86)\ArcGIS\Engine10.2\com\esriSystemUI.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR",/*"ICommand",*/"IProgressDialog") rename("ICommand", "esriICommand")
#import "C:\Program Files (x86)\ArcGIS\Engine10.2\com\esriControls.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "C:\Program Files (x86)\ArcGIS\Engine10.2\com\esriGeometry.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR")
#import "C:\Program Files (x86)\ArcGIS\Engine10.2\com\esriDisplay.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR") rename("RGB", "esriRGB") rename("CMYK", "esriCMYK") rename("ResetDC", "esriResetDC") rename("GetMessage", "esriGetMessage")
#import "C:\Program Files (x86)\ArcGIS\Engine10.2\com\esriOutput.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR")
#import "C:\Program Files (x86)\ArcGIS\Engine10.2\com\esriGeoDatabase.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR"/*,"ICursor"*/), rename("GetMessage", "esriGetMessage") ,rename("ICursor", "esriICursor"),rename("IRow", "esriIRow")
#import "C:\Program Files (x86)\ArcGIS\Engine10.2\com\esriDataSourcesFile.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "C:\Program Files (x86)\ArcGIS\Engine10.2\com\esriDataSourcesRaster.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR"/*,"IWorkspaceFactory","IWorkspace"*/)
#import "C:\Program Files (x86)\ArcGIS\Engine10.2\com\esriCarto.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR","UINT_PTR") rename("ITableDefinition","esriITableDefinition")

#pragma warning(pop)
</pre><pre name="code" class="cpp">
"C:\Program Files (x86)\ArcGIS\Engine10.2\com\esriSystemUI.olb" //库的路径 选择自己的ArcEngine安装目录,如果是安装的DeskTop+ArcObjects sdk将路径改为"C:\Program Files (x86)\ArcGIS\Desktop10.2\com\esriSystemUI.olb"
6、在MapExView.h 头文件中添加接口对象的变量
IMapControl2Ptr m_ipMapControl; //指向MapControl的指针
7、通过类向导向CMapExView添加WM_CREATE消息,在OnCreate方法中添加如下代码
int CMapExView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO:  在此添加您专用的创建代码
//初始化许可
::CoInitialize(NULL);
ArcGISVersionLib::IArcGISVersionPtr ipVer(__uuidof(ArcGISVersionLib::VersionManager));
VARIANT_BOOL succeeded;
if (FAILED(ipVer->LoadVersion(ArcGISVersionLib::esriArcGISEngine , L"10.2",&succeeded))) //10.2 版本
return -1;
IAoInitializePtr m_AoInit;//(CLSID_AoInitialize);
m_AoInit.CreateInstance (CLSID_AoInitialize);
esriLicenseStatus ls;
HRESULT h= m_AoInit->Initialize(esriLicenseProductCode::esriLicenseProductCodeEngineGeoDB ,&ls);
return 0;
}
在MapExView的OnInitialUpdate()方法中添加MapControl控件的初始化代码
void CMapExView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();

//MapControl控件
CWnd* pWndCal=GetDlgItem(IDC_MAPCONTROL1);
LPUNKNOWN pUnk=pWndCal->GetControlUnknown();
pUnk->QueryInterface(IID_IMapControl2,(LPVOID *)&m_ipMapControl);
}
这时候运行程序就可以显示地图了,但是这时候的MapControl控件是没有固定的,不能随着窗体的大小变化调整大小,所以需要添加WM_SIZE消息,在OnSize中添加如下代码
void CMapExView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
CWnd* pWndMapCtrl = GetDlgItem(IDC_MAPCONTROL1);
if (pWndMapCtrl)
pWndMapCtrl->MoveWindow(0,0,cx,cy);
}
在MapExView.h中添加枚举
enum BROWSETASK
{
eViewDefault, //默认状态
eViewZoomIn,//放大
eViewZoomOut,//缩小
eViewPan//漫游
}m_eCurView;
添加ID_MAP_ZOOMIN(放大)、ID_MAP_ZOOMOUT(缩小)等按钮的消息处理函数,可以分别建立,也可以统一建立,这里采取统一建立的方式在MapExView.h中加入如下代码
afx_msg void OnMapOperator(UINT nID);
在MapExView.cpp中加入
BEGIN_MESSAGE_MAP(CMapExView, CFormView)
ON_WM_CREATE()
ON_COMMAND_RANGE(ID_MAP_ZOOMIN,ID_MAP_DEFAUT,OnMapOperator)/*按钮的消息处理函数添加的代码,ID_MAP_ZOOMIN,ID_MAP_DEFAUT 连续的按钮ID第一位和最后一位*/
ON_WM_SIZE()
END_MESSAGE_MAP()
void CMapExView::OnMapOperator(UINT nID)
{
switch (nID)
{
case ID_MAP_ZOOMIN:
m_eCurView = eViewZoomIn;
m_ipMapControl->put_MousePointer(esriPointerZoomIn);//设置鼠标状态
break;
case  ID_MAP_ZOOMOUT:
m_eCurView = eViewZoomOut;
m_ipMapControl->put_MousePointer(esriPointerZoomOut);//设置鼠标状态
break;
case ID_MAP_PAN:
m_eCurView = eViewPan;
m_ipMapControl->put_MousePointer(esriPointerPan);
break;
case ID_MAP_FULLEXTENT:
m_eCurView = eViewDefault;
IEnvelope* pEnvFullExtent;
m_ipMapControl->get_FullExtent(&pEnvFullExtent);
m_ipMapControl->put_Extent(pEnvFullExtent);
m_ipMapControl->put_MousePointer(esriPointerDefault);
break;
case  ID_MAP_DEFAUT:
m_eCurView = eViewDefault;
m_ipMapControl->put_MousePointer(esriPointerDefault);//还原鼠标状态
break;

}
}
添加MapControl的鼠标消息响应函数在MapExView.h中加入如下代码
afx_msg void OnMouseDownMapControl(long button,long shift,long x,long y,double mapX,double mapY);
DECLARE_EVENTSINK_MAP()
在MapExView.cpp中加入
BEGIN_EVENTSINK_MAP(CMapExView,CFormView)
ON_EVENT(CMapExView,IDC_MAPCONTROL1,1/*OnMouseDown*/,OnMouseDownMapControl,VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_R8 VTS_R8)
END_EVENTSINK_MAP()
void CMapExView::OnMouseDownMapControl(long button,long shift,long x,long y,double mapX,double mapY){if(button==1)//鼠标左键按下{switch (m_eCurView){case CMapExView::eViewZoomIn:{IEnvelope* pEnvZoomIn;m_ipMapControl->TrackRectangle(&pEnvZoomIn);m_ipMapControl4000->put_Extent(pEnvZoomIn);}break;case CMapExView::eViewZoomOut:{IEnvelope* pEnvZoomOut;m_ipMapControl->TrackRectangle(&pEnvZoomOut);IEnvelope* pEnvMapExtent;m_ipMapControl->get_Extent(&pEnvMapExtent);double dx1,dy1,dx2,dy2;pEnvZoomOut->get_Width(&dx1);pEnvMapExtent->get_Width(&dx2);pEnvZoomOut->get_Height(&dy1);pEnvMapExtent->get_Height(&dy2);pEnvZoomOut->Expand(dx2/dx1*2,dy2/dy1*2,VARIANT_TRUE);m_ipMapControl->put_Extent(pEnvZoomOut);}break;case CMapExView::eViewPan:m_ipMapControl->Pan();break;}}}
转载请注明出处,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  VC++ ArcEngine10.2