项目用vc6.0+MapObject写的,现在却要升级成AE10,研究了好多天的AE10.0和c++,中间的曲折也不想多说了,废话少数,下面是实现ArcEngine基本功能的,仅供参考,如能帮到同仁们,那就很欣慰了。

前提:已经安装了ArcGIS10.0,ArcEngine10.0 C++开发包,已经安装了vs2010,win7 32位(64位暂未验证)

总的来说分为如下几步:

1.引入库文件

2.加入地图控件

3.将地图控件和成员变量绑定

4.初始化许可

5.加载数据

6.添加功能

1.首先请建立一个MFC的工程,这里选择在左侧已安装的模板的visual C++下的MFC,这里取工程名字叫1111,应用程序类型单文档和多文档都没有区别,但是在生成的类中基类要选择“CFormView”。点击完成。然后是在stdafx.h中引入库文件。

请将下面的代码原封不动的粘贴到stdafx.h的最后面

  1. #pragma warning(push)
  2. #pragma warning(disable : 4192) /* Ignore warnings for types that are duplicated in win32 header files */
  3. #pragma warning(disable : 4146) /* Ignore warnings for use of minus on unsigned types */
  4. #import "libid:6FCCEDE0-179D-4D12-B586-58C88D26CA78" raw_interfaces_only no_implementation
  5. #import "D:\Program Files\ArcGIS\Desktop10.0\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")
  6. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriSystemUI.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR",/*"ICommand",*/"IProgressDialog") rename("ICommand", "esriICommand")
  7. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriControls.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
  8. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriGeometry.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR")
  9. #import "D:\Program Files\ArcGIS\Desktop10.0\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")
  10. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriOutput.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR")
  11. #import "D:\Program Files\ArcGIS\Desktop10.0\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")
  12. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriDataSourcesFile.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
  13. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriDataSourcesRaster.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR"/*,"IWorkspaceFactory","IWorkspace"*/)
  14. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriCarto.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR","UINT_PTR") rename("ITableDefinition","esriITableDefinition")
  15. #pragma warning(pop)
  1. #pragma warning(push)
  2. #pragma warning(disable : 4192) /* Ignore warnings for types that are duplicated in win32 header files */
  3. #pragma warning(disable : 4146) /* Ignore warnings for use of minus on unsigned types */
  4. #import "libid:6FCCEDE0-179D-4D12-B586-58C88D26CA78" raw_interfaces_only no_implementation
  5. #import "D:\Program Files\ArcGIS\Desktop10.0\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")
  6. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriSystemUI.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR",/*"ICommand",*/"IProgressDialog") rename("ICommand", "esriICommand")
  7. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriControls.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
  8. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriGeometry.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR")
  9. #import "D:\Program Files\ArcGIS\Desktop10.0\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")
  10. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriOutput.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR")
  11. #import "D:\Program Files\ArcGIS\Desktop10.0\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")
  12. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriDataSourcesFile.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
  13. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriDataSourcesRaster.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR"/*,"IWorkspaceFactory","IWorkspace"*/)
  14. #import "D:\Program Files\ArcGIS\Desktop10.0\com\esriCarto.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids,exclude("OLE_COLOR","UINT_PTR") rename("ITableDefinition","esriITableDefinition")
  15.  
  16. #pragma warning(pop)

修改下:导入库文件时,不要排除IRow和ITableDefinition,而是重命名(比如esriIRow),不然会有很多不必要的麻烦,比如选择集取属性值出错等

注意:

(1)头三行和最后一行是忽略一些不必要的警告

(2)第四行一定要有,从esri官网上抄下来的,作用暂时不明确

(3)这里引入库文件的地址是绝对地址,我的ArcGIS安装在D盘,请改成对应的安装盘,也可以把*.olb文件取出来改成相对地址,随便。

(4)类似于rename("ICommand", "esriICommand")这样的语句,是因为esri的关键字与MFC的关键字冲突了,重命名下,在代码中使用AE的关键字的时候,也用已经重命名的关键字

(5)类似于exclude("OLE_COLOR"),是因为MFC中已经有了这样的类,不需要再导入了

(6)导入这些库文件是有前后顺序的,关于导入的顺序,请参开esri官网,地址如下

http://help.arcgis.com/en/sdk/10.0/arcobjects_cpp/componenthelp/index.html#//000200000001000000

这里有顺序的说明和大部分库文件的部分作用描述

2.引入了库文件,接下来加入地图控件。

请在类视图中找到CMy1111View,然后右键“转到对话框视图“,然后从左侧工具箱中拖一个ESRI MapControl到视图框中,如果没有ESRI的控件,请先右键建立一个选项卡,取名ESRI,然后右键选择项-COM组件选项卡,选择ESRI MapControl,OK。如下图:

3.将地图控件和成员变量绑定

首先请在CMy1111View类头文件中添加一个成员变量如下

IMapControl2Ptr m_ipMapControl;/*指向当前地图文档的指针*/

然后给这个类添加虚函数OnDraw(),然后再OnDraw函数中使用如下几句关联控件和成员变量

  1. void CMy1111View::OnDraw(CDC* /*pDC*/)
  2. {
  3. // TODO: 在此添加专用代码和/或调用基类
  4. //关联控件代码
  5. CWnd * pWndCal = GetDlgItem(IDC_MAPCONTROL1);
  6. LPUNKNOWN pUnk = pWndCal ->GetControlUnknown( );
  7. pUnk->QueryInterface( IID_IMapControl2, (LPVOID *)& m_ipMapControl );
  8. }
  1. void CMy1111View::OnDraw(CDC* /*pDC*/)
  2. {
  3. // TODO: 在此添加专用代码和/或调用基类
  4.  
  5. //关联控件代码
  6. CWnd * pWndCal = GetDlgItem(IDC_MAPCONTROL1);
  7. LPUNKNOWN pUnk = pWndCal ->GetControlUnknown( );
  8. pUnk->QueryInterface( IID_IMapControl2, (LPVOID *)& m_ipMapControl );
  9.  
  10. }

4.接下来我们初始化许可

请给CMy1111View类添加消息WM_CREATE,生成OnCreate()函数,然后再OnCreate()函数中添加如下代码初始化AE许可

  1. int CMy1111View::OnCreate(LPCREATESTRUCT lpCreateStruct)
  2. {
  3. if (CFormView::OnCreate(lpCreateStruct) == -1)
  4. return -1;
  5. // TODO:  在此添加您专用的创建代码
  6. //初始化Engine许可
  7. ::CoInitialize(NULL);
  8. ArcGISVersionLib::IArcGISVersionPtr ipVer(__uuidof(ArcGISVersionLib::VersionManager));
  9. VARIANT_BOOL succeeded;
  10. if (FAILED(ipVer->LoadVersion(ArcGISVersionLib::esriArcGISDesktop , L"10.1",&succeeded)))
  11. return -1;
  12. IAoInitializePtr m_AoInit;//(CLSID_AoInitialize);
  13. m_AoInit.CreateInstance (CLSID_AoInitialize);
  14. esriLicenseStatus ls;
  15. HRESULT h= m_AoInit->Initialize(esriLicenseProductCode::esriLicenseProductCodeEngineGeoDB ,&ls);
  16. return 0;
  17. }
  1. int CMy1111View::OnCreate(LPCREATESTRUCT lpCreateStruct)
  2. {
  3. if (CFormView::OnCreate(lpCreateStruct) == -1)
  4. return -1;
  5.  
  6. // TODO: 在此添加您专用的创建代码
  7.  
  8. //初始化Engine许可
  9. ::CoInitialize(NULL);
  10. ArcGISVersionLib::IArcGISVersionPtr ipVer(__uuidof(ArcGISVersionLib::VersionManager));
  11. VARIANT_BOOL succeeded;
  12. if (FAILED(ipVer->LoadVersion(ArcGISVersionLib::esriArcGISDesktop , L"10.0",&succeeded)))
  13. return -1;
  14. IAoInitializePtr m_AoInit;//(CLSID_AoInitialize);
  15. m_AoInit.CreateInstance (CLSID_AoInitialize);
  16. esriLicenseStatus ls;
  17. HRESULT h= m_AoInit->Initialize(esriLicenseProductCode::esriLicenseProductCodeEngineGeoDB ,&ls);
  18.  
  19. return 0;
  20. }

5.加载数据

我们通过重载MFC的打开按钮来实现。给ID_FILE_OPEN添加消息响应,然后在OnFileOpen()函数中实现数据的加载。

在这里我们通过调用自定义添加的函数LoadData()来实现。函数如下:

  1. void CAEMFCRibbonView::LoadData(/*CString strFileName*/)
  2. {
  3. //char sfileter[]="Shape files(*.Shp)|*.Shp|mxd文档(*.mxd)|*.mxd|所有文件(*.*)";
  4. CFileDialog dlg(TRUE, //TRUE为OPEN对话框,FALSE为SAVE AS对话框
  5. NULL,
  6. NULL,
  7. OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  8. (LPCTSTR)_TEXT("所有文件|*.*|mxd文档(*.mxd)|*.mxd|Shape files(*.shp)|*.shp|"),
  9. NULL);
  10. CString m_strFileName;
  11. if(dlg.DoModal()==IDOK)
  12. {
  13. //m_MapControl=new CMapControl2();
  14. m_strFileName=dlg.GetPathName();//全路径名
  15. //CString filepath=dlg.GetFolderPath();//路径名称,不带文件名
  16. //CString filename=dlg.GetFileName();//文件名,不带路径
  17. CString strExt = dlg.GetFileExt();//后缀名,不带点
  18. if (strExt=="shp")
  19. {
  20. CComBSTR MX_DATAFILE;
  21. //MX_DATAFILE = "F:\\测试mxd文档\\shenzhen.mxd" ;
  22. MX_DATAFILE=dlg.GetPathName();
  23. BSTR filePath=dlg.GetFolderPath().AllocSysString();
  24. BSTR fileName=dlg.GetFileName().AllocSysString();
  25. m_ipMapControl->AddShapeFile(filePath,fileName);
  26. }
  27. else if(strExt=="mxd")
  28. {
  29. CComBSTR MX_DATAFILE;
  30. //MX_DATAFILE = "F:\\测试mxd文档\\shenzhen.mxd" ;
  31. MX_DATAFILE=dlg.GetPathName();
  32. VARIANT_BOOL bValidDoc;
  33. //m_MapControlView.CheckMxFile( MX_DATAFILE );
  34. m_ipMapControl->CheckMxFile( MX_DATAFILE, & bValidDoc );
  35. //VARIANT vt = 0;
  36. if (bValidDoc)
  37. m_ipMapControl->LoadMxFile(MX_DATAFILE);
  38. }
  39. else
  40. {
  41. AfxMessageBox(_T("请选择合适的文件!"));
  42. return;
  43. }
  44. m_ipMapControl->Refresh(esriViewAll);
  45. }
  46. }
  1. void CAEMFCRibbonView::LoadData(/*CString strFileName*/)
  2. {
  3. //char sfileter[]="Shape files(*.Shp)|*.Shp|mxd文档(*.mxd)|*.mxd|所有文件(*.*)";
  4. CFileDialog dlg(TRUE, //TRUE为OPEN对话框,FALSE为SAVE AS对话框
  5. NULL,
  6. NULL,
  7. OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  8. (LPCTSTR)_TEXT("所有文件|*.*|mxd文档(*.mxd)|*.mxd|Shape files(*.shp)|*.shp|"),
  9. NULL);
  10. CString m_strFileName;
  11. if(dlg.DoModal()==IDOK)
  12. {
  13. //m_MapControl=new CMapControl2();
  14.  
  15. m_strFileName=dlg.GetPathName();//全路径名
  16. //CString filepath=dlg.GetFolderPath();//路径名称,不带文件名
  17. //CString filename=dlg.GetFileName();//文件名,不带路径
  18. CString strExt = dlg.GetFileExt();//后缀名,不带点
  19. if (strExt=="shp")
  20. {
  21. CComBSTR MX_DATAFILE;
  22. //MX_DATAFILE = "F:\\测试mxd文档\\shenzhen.mxd" ;
  23. MX_DATAFILE=dlg.GetPathName();
  24. BSTR filePath=dlg.GetFolderPath().AllocSysString();
  25. BSTR fileName=dlg.GetFileName().AllocSysString();
  26. m_ipMapControl->AddShapeFile(filePath,fileName);
  27. }
  28. else if(strExt=="mxd")
  29. {
  30. CComBSTR MX_DATAFILE;
  31. //MX_DATAFILE = "F:\\测试mxd文档\\shenzhen.mxd" ;
  32. MX_DATAFILE=dlg.GetPathName();
  33. VARIANT_BOOL bValidDoc;
  34. //m_MapControlView.CheckMxFile( MX_DATAFILE );
  35. m_ipMapControl->CheckMxFile( MX_DATAFILE, & bValidDoc );
  36. //VARIANT vt = 0;
  37. if (bValidDoc)
  38. m_ipMapControl->LoadMxFile(MX_DATAFILE);
  39. }
  40. else
  41. {
  42. AfxMessageBox(_T("请选择合适的文件!"));
  43. return;
  44. }
  45. m_ipMapControl->Refresh(esriViewAll);
  46. }
  47. }

运行程序已经可以看到地图控件,点击打开文件按钮,选择一个shp文件,确定,效果如下:

这个时候地图控件还没有充满整个客户区屏幕,我们添加WM_SIZE消息响应,并添加如下代码,就能自动调整尺寸了。

  1. void CAEMFCRibbonView::OnSize(UINT nType, int cx, int cy)
  2. {
  3. CFormView::OnSize(nType, cx, cy);
  4. // TODO: 在此处添加消息处理程序代码
  5. CWnd *pMapCtl = GetDlgItem( IDC_MAPCONTROL1 );
  6. //CRect MapCtlrect;
  7. if ( pMapCtl )
  8. {
  9. //pMapCtl->GetWindowRect( &MapCtlrect );
  10. pMapCtl->MoveWindow( 0,0, cx, cy );
  11. }
  12. }
  1. void CAEMFCRibbonView::OnSize(UINT nType, int cx, int cy)
  2. {
  3. CFormView::OnSize(nType, cx, cy);
  4.  
  5. // TODO: 在此处添加消息处理程序代码
  6. CWnd *pMapCtl = GetDlgItem( IDC_MAPCONTROL1 );
  7. //CRect MapCtlrect;
  8. if ( pMapCtl )
  9. {
  10. //pMapCtl->GetWindowRect( &MapCtlrect );
  11. pMapCtl->MoveWindow( 0,0, cx, cy );
  12. }
  13. }

先到这里,下午再来更新添加自定义的放大缩小等地图工具和取属性等。

转:ArcEngine10.0+VS2010+MFC 扫盲贴 .的更多相关文章

  1. VS2010/MFC编程入门之四(MFC应用程序框架分析)

    VS2010/MFC编程入门之四(MFC应用程序框架分析)-软件开发-鸡啄米 http://www.jizhuomi.com/software/145.html   上一讲鸡啄米讲的是VS2010应用 ...

  2. VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)

    VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)-软件开发-鸡啄米 http://www.jizhuomi.com/software/141.html   上一讲中讲了VS20 ...

  3. VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)

    原文地址: VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)-软件开发-鸡啄米 http://www.jizhuomi.com/software/139.html   上一讲中鸡 ...

  4. ArcEngine10在VS2010中编译问题

    原文 http://www.gisall.com/html/47/122747-4141.html 问题描述: 前段时间装了个VS2010,用ArcEngine10在VS2010中基于.Net Fra ...

  5. VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)

    上一节中鸡啄米讲了CDC类及其屏幕绘图函数,本节的主要内容是GDI对象之画笔CPen. GDI对象 在MFC中,CGdiObject类是GDI对象的基类,通过查阅MSDN我们可以看到,CGdiObje ...

  6. VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)

    上一节中鸡啄米讲了文本输出的知识,本节的主要内容是CDC类及其屏幕绘图函数. CDC类简介 CDC类是一个设备上下文类. CDC类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户 ...

  7. VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类)

    上一节中鸡啄米讲了MFC异常处理,本节的主要内容是字体CFont类. 字体简介 GDI(Graphics Device Interface),图形设备接口,是Windows提供的一些函数和结构,用于在 ...

  8. VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)

    上一节中鸡啄米讲了文档.视图和框架结构中各对象之间的关系,本节主要讲讲在MFC中如何分割窗口. 分割窗口概述       分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或 ...

  9. VS2010/MFC编程入门之三十八(状态栏的使用详解)

    上一节中鸡啄米讲了工具栏的创建.停靠与使用,本节来讲解状态栏的知识. 状态栏简介 状态栏相信大家在很多窗口中都能见到,它总是用来显示各种状态.状态栏实际上也是一个窗口,一般分为几个窗格,每个窗格分别用 ...

随机推荐

  1. JavaScript:Math 对象

    ylbtech-JavaScript:Math 对象 Math 对象用于执行数学任务. 使用 Math 的属性和方法的语法: var pi_value=Math.PI; var sqrt_value= ...

  2. 《Hadoop大数据架构与实践》学习笔记

    学习慕课网的视频:Hadoop大数据平台架构与实践--基础篇http://www.imooc.com/learn/391 一.第一章 #,Hadoop的两大核心:     #,HDFS,分布式文件系统 ...

  3. 构建配置 ProGuard Shrink 混淆和压缩

    官方文档 压缩代码和资源 要尽可能减小 APK 文件,您应该启用压缩来移除 release build 中未使用的代码和资源.此页面介绍如何执行该操作,以及如何指定要在构建时保留或舍弃的代码和资源. ...

  4. 【cocos2dx中Node类getParent和getChildByTag()】学习体会

    參考http://cn.cocos2d-x.org/doc/cocos2d-x-3.0/d3/d82/classcocos2d_1_1_node.html 当中和child.parent有关的成员函数 ...

  5. 【转】深入理解line-height

    原文: http://www.cnblogs.com/dolphinX/p/3236686.html https://www.cnblogs.com/yangjie-space/p/4858132.h ...

  6. -webkit-margin-before

    原文:https://www.cnblogs.com/guyw/p/4369653.html ----------------------------------------------- -webk ...

  7. iis 防火墙防止恶意ip攻击

    今天发现服务器里,一个IP不停的占用我的网络资源,然后在防火墙里配置,将其禁止访问,网络很快降了下来. 这个恶意的IP是 115.171.60.62

  8. 【python】bytes与字符串的相互转化

    代码: # bytes转字符串方式一 b=b'\xe9\x80\x86\xe7\x81\xab' string=str(b,'utf-8') print(string) # bytes转字符串方式二 ...

  9. 【nodejs】理想论坛帖子下载爬虫1.07 使用request模块后稳定多了

    在1.06版本时,访问网页采用的时http.request,但调用次数多以后就问题来了. 寻找别的方案时看到了https://cnodejs.org/topic/53142ef833dbcb076d0 ...

  10. C118+OSMCOMBB嗅探短信

    ubuntu系统:12.04.4, 下载地址:http://cdimage.ubuntu.com/releases/12.04.4/release/ 编译环境下载 : http://pan.baidu ...