醒也罢 梦也罢 人生苦短
Visual C++ 2005, ArcGIS Engine 9.2, ATL对话框程序
首先向还在被迫学习或使用MFC、ATL之类代表原始社会生产力的工具的同志们道一声,你们辛苦了! 我郁闷了好长时间才把一个使用ArcGIS Engine的ATL程序弄起来。把详细过程分享出来,避免像我一样不熟悉ATL/COM的人走弯路。ArcGIS可以用C#或Java开发,但有时候你不能自己决定。 准备工作: Ctrl+Shift+N,New Project 选择Visual C++下的ATL,在右侧选择ATL Project,在Name栏填写project name,ATLDialog,OK 在随即出现的ATL Project Wizard里,选择“Application Settings”,Server Type选择Executable,点击Finish 项目已经生成。在Class View中,右击ATLDialog,Add=>Class 在Add Class对话框中,选择ATL Dialog,点击Add。接下来的ATL Dialog Wizard中,在Short name中填写TestDialog,点击Finish 向导已经为我们生成了一个ATL对话框的框架。 试一下吧。在文件ATLDialog.cpp中,找到_tWinMain函数,在前面添加代码: CTestDialog dlg; dlg.DoModal(); 并且在前面要包含我们对话框的声明:#include “TestDialog.h” 按下F7,编译结束后对话框弹出了,按下OK,程序正常结束。 接下来,我们就可以在此基础上加上ArcGIS的控件了(给地图控件加一个点击事件处理)。 Resource View中,ATLDialog->ATLDialog.rc->Dialog->IDD_TESTDIALOG,打开对话框编辑窗口 对话框稍微拉大点,右键->Insert ActiveX Control。在弹出的框中选择ESRI MapControl,同样方法加入ESRI LicenseControl 调整好MapControl的大小位置后,右键->Add Event Handler 弹出的向导中,选择CTestDialog类,Message Type选择OnMouseUp,点击Add and Edit 输入代码: > IMapControl3Ptr ipMapControl; > GetDlgControl(IDC_MAPCONTROL1, IID_IMapControl3, (void**) &ipMapControl); > ipMapControl->AboutBox(); 关键时刻来了。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” ...