Visual C++ 2005, ArcGIS Engine 9.2, ATL对话框程序

首先向还在被迫学习或使用MFC、ATL之类代表原始社会生产力的工具的同志们道一声,你们辛苦了!

我郁闷了好长时间才把一个使用ArcGIS Engine的ATL程序弄起来。把详细过程分享出来,避免像我一样不熟悉ATL/COM的人走弯路。ArcGIS可以用C#或Java开发,但有时候你不能自己决定。

准备工作:

  1. Ctrl+Shift+N,New Project
  2. 选择Visual C++下的ATL,在右侧选择ATL Project,在Name栏填写project name,ATLDialog,OK
  3. 在随即出现的ATL Project Wizard里,选择“Application Settings”,Server Type选择Executable,点击Finish
  4. 项目已经生成。在Class View中,右击ATLDialog,Add=>Class
  5. 在Add Class对话框中,选择ATL Dialog,点击Add。接下来的ATL Dialog Wizard中,在Short name中填写TestDialog,点击Finish
  6. 向导已经为我们生成了一个ATL对话框的框架。

试一下吧。在文件ATLDialog.cpp中,找到_tWinMain函数,在前面添加代码:

CTestDialog dlg;
dlg.DoModal();

并且在前面要包含我们对话框的声明:#include “TestDialog.h”
按下F7,编译结束后对话框弹出了,按下OK,程序正常结束。

接下来,我们就可以在此基础上加上ArcGIS的控件了(给地图控件加一个点击事件处理)。

  1. Resource View中,ATLDialog->ATLDialog.rc->Dialog->IDD_TESTDIALOG,打开对话框编辑窗口
  2. 对话框稍微拉大点,右键->Insert ActiveX Control。在弹出的框中选择ESRI MapControl,同样方法加入ESRI LicenseControl
  3. 调整好MapControl的大小位置后,右键->Add Event Handler
  4. 弹出的向导中,选择CTestDialog类,Message Type选择OnMouseUp,点击Add and Edit
  5. 输入代码:

    IMapControl3Ptr ipMapControl;
    GetDlgControl(IDC_MAPCONTROL1, IID_IMapControl3, (void**) &ipMapControl);
    ipMapControl->AboutBox();

  6. 关键时刻来了。IMapControl3Ptr这些接口的定义在哪里呢?不要试图在ArcGIS的VC++ Help for VS2005中找到答案,它会让你郁闷几天的。
    在stdafx.h中找到#include <atlcom.h>这行,把它替换成下面的代码(根据你的ArcGIS安装位置更改):

    #define ISegment IMSSegment
    #include <atlcom.h>
    #include <atlwin.h>
    #undef ISegment

    #include “C:\Program Files\ArcGIS\include\CPPAPI\SDK_Windows.h”

  7. 按下F7,对话框又出现了,并且有淡蓝色背景的地图控件,在上面点右键,ESRI的授权声明就跳出来了。

ArcGIS的文档里,我没有发现有关于如何解决ISegment重复定义的介绍。而且文档中也没有提到SDK_Windows.h这个文件,只说那些控件的定义应该如何去导入,很繁琐,其实包含这个文件就可以了。

好了,有了这个基础,其它的翻翻文档和Sample应该就问题不大了,你可以试试加载一幅地图进来。

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.