#pragma region 绑定许可
IArcGISVersionPtr ipVer(__uuidof(VersionManager)); VARIANT_BOOL succeeded;
if (FAILED(ipVer->LoadVersion(esriArcGISEngine , L\,&succeeded)))
return false;
#pragma endregion
#pragma region 初始化许可
IAoInitializePtr ipInit(CLSID_AoInitialize); esriLicenseStatus status;
ipInit->Initialize(esriLicenseProductCodeEngine, &status); if (status != esriLicenseCheckedOut)
AoExit(0);
return true;
#pragma endregion }
1.2.4 如何显示地图
现在头文件,初始化许可的事情都搞定了,但是地图如何显示?想象下C#
是如何做的,拖一个地图控件上去,然后将数据在这个地图控件上显示,但是这是VC,不是这么简单,当然地图控件肯定是ESRI提供,微软不会提供一个容纳地图的控件吧?两种方法:插入控件和直接生成相关的类,我们先用第二个方法,顺便回一
下MFC。
1.2.5 添加和地图控件相关的MFC类
在工程上右键,添加类,选择第一个,如下图:
弹出一个向导,在可用的ActiveX控件中找到Esri的地图控件,设置生成的类,如下图:
在CMapMFCView类中添加头文件,定义一个CMapControl2的变量,如下图:
在类视图中,右键该类,转到“对话框“,出现如下界面:
在上图中拖一个按钮上去,改一下属性,并且添加单击事件(使用类向导完成),然后添加下面的代码(先不要管,我会在后面介绍,CWsClass类是我添加的用来获取要素类的见后面)
void CMapMFCView::OnClickedBtn() {
BSTR bStringWS = SysAllocString(L\数据\\\\1\); BSTR bStrFcName = SysAllocString(L\);
IFeatureClassPtr ipFeatureClassTest=pWs.GetFeatureClass(bStringWS,bStrFcName); SysFreeString(bStrFcName); CWsClass pWs; CRect r;
GetClientRect(&r);
SysFreeString(bStringWS); IFeatureLayer *ipFeatureLayerX;
// 查看注册表或者tlh文件{E663A651-8AAD-11D0-BEC7-00805F7C4268} 完完全全通过COM自己创建对象 HRESULT
hr1=::CoCreateInstance(CLSID_FeatureLayer,NULL,CLSCTX_ALL,IID_IFeatureLayer,(void**)&ipFeatureLayerX);
m_MapControl.put_BackColor(16777215); //手动释放
ipFeatureLayerX->Release(); ipDsetTest->Release();
m_ipMapControl->AddLayer(ipFeatureLayerX,0); IDataset *ipDsetTest;
HRESULT hr2=ipFeatureLayerX->QueryInterface(__uuidof(IDataset),(void**)&ipDsetTest); if(FAILED(hr2))
return; //赋值
ipFeatureLayerX->putref_FeatureClass(ipFeatureClassTest);
//这句类似Windows的用类来创建窗体(MapControl控件)
m_MapControl.Create(L\,WS_CHILD|WS_VISIBLE,r,this,10000); //获取指针
IMapControl2Ptr m_ipMapControl=m_MapControl.GetControlUnknown(); if(FAILED(hr1))
return;