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实现GIS系统基本功能
- ArcGIS.Server.9.3和ArcGIS API for JavaScript实现基本的地图功能(一)
- 百度地图入门一:获取秘钥和基本地图功能实现
- android+高德地图实现基本地图和基本定位功能
- ArcGIS.Server.9.3和ArcGIS API for JavaScript实现基本的地图功能(一)
- VC+MapX 地图的放大,缩小,漫游,归心功能的实现
- 百度地图入门一:获取秘钥和基本地图功能实现
- openlayer调用geoserver发布的地图实现地图的基本功能
- ArcGIS API For Javascript之地图基本加载与显示,地图切换、缩放、定位、比例尺、鹰眼图、坐标显示、查询搜索功能实现
- ArcGIS.Server.9.3和ArcGIS API for JavaScript实现基本的地图功能(一)
- 用VC实现GIS系统基本功能
- ArcGIS.Server.9.3和ArcGIS API for JavaScript实现基本的地图功能(一)
- ArcGIS.Server.9.3和ArcGIS API for JavaScript实现基本的地图功能
- [转]ArcGIS.Server.9.3和ArcGIS API for Flex实现基本的地图浏览(一)
- Qt + GDAL遥感图像基本浏览功能实现
- ArcEngine中使用上下左右键移动地图功能的实现
- ArcGIS.Server.9.3和ArcGIS API for Flex实现基本的地图浏览(一)
- 使用百度地图实现基本的地图显示与定位功能
- VC实现俄罗斯方块的基本功能
- ArcGIS JavaScript API 实现基本的地图功能