VC+AO 下载本文

m_pAV=m_ctrlMap.GetActiveView(); m_ipMap=m_ctrlMap.GetMap(); //取得图层

ILayerPtr ipLayer ;

m_ipMap->get_Layer(0,&ipLayer); m_ipFeatLyr = ipLayer;

//设置编辑图层为唯一可选,此处设TOC中最上面的图层为编辑图层 hr=m_ipMap->ClearSelection(); if (FAILED(hr)) return FALSE; long nLyrCnt;

m_ipMap->get_LayerCount(&nLyrCnt); for(long i=0; i

m_ipMap->get_Layer(i,&ipLayer); IFeatureLayerPtr ipFeatLyr = ipLayer; if(ipFeatLyr != m_ipFeatLyr)

ipFeatLyr->put_Selectable(VARIANT_FALSE); }

m_ipFeatLyr->put_Selectable(VARIANT_TRUE); //创建显示反馈对象

m_pAV->get_ScreenDisplay(&ipDisp);

m_ipNEFdbk.CreateInstance(CLSID_NewEnvelopeFeedback); m_ipNEFdbk->putref_Display(ipDisp);

m_ipMPFdbk.CreateInstance(CLSID_MovePointFeedback); m_ipMPFdbk->putref_Display(ipDisp);

在View 类的 MouseDown 事件中添加如下代码

OnOnMouseDownControl(long button, long shift, long x, long y, double mapX, double mapY) {

if ((shift!=1) //未按shift键则返回 return; HRESULT hr;

IPointPtr ipCurPnt(CLSID_Point);

hr=ipCurPnt->PutCoords(mapX,mapY); if (FAILED(hr)) return ;

//若无选中要素,则为选择操作,否则是移动操作

if (NULL==m_ipCurFeat) {

m_ipNEFdbk->Start(ipCurPnt); m_bSel = TRUE; } else {

IGeometryPtr ipGeo;

hr=m_ipCurFeat->get_Shape(&ipGeo); IPointPtr ipPoint(ipGeo);

m_ipMPFdbk->Start(ipPoint,ipCurPnt); m_bMove = TRUE; } }

在View 类的 MouseMove 事件中添加如下代码 OnOnMouseMoveControl(long button, long shift, long x, long y, double mapX, double mapY) {

if ((shift!=1) //未按shift键则返回 return;

if(m_pAV==NULL || m_ipMap== NULL) return;

IPointPtr ipPoint(CLSID_Point); ipPoint->PutCoords(mapX,mapY);

//注意判断的顺序m_bSel要在(m_ipCurFeat==NULL)前,不然,程序崩溃,建议多写几个if

if( m_bSel && m_ipNEFdbk != NULL && m_ipCurFeat==NULL) m_ipNEFdbk->MoveTo(ipPoint);

else if(m_ipMPFdbk != NULL && m_bMove) m_ipMPFdbk->MoveTo(ipPoint); }

在View 类的 MouseUp 事件中添加如下代码: OnOnMouseUpControl(long button, long shift, long x, long y, double mapX, double mapY) {

if ((shift!=1) //未按shift键则返回 return;

if(m_pAV==NULL || m_ipMap== NULL) return;

if(m_bSel)/*m_ipCurFeat==NULL */ {

IEnvelopePtr ipEnv;

m_ipNEFdbk->Stop(&ipEnv);

m_ipMap->SelectByShape(ipEnv,NULL,VARIANT_TRUE); m_pAV->PartialRefresh(esriViewGeoSelection,NULL,NULL); IFeatureSelectionPtr ipFeatSel(m_ipFeatLyr); ISelectionSetPtr ipSelSet;

ipFeatSel->get_SelectionSet(&ipSelSet); //搜索光标可以获取用查询过滤确定的行

IQueryFilterPtr ipQF(CLSID_QueryFilter); ICursorPtr ipCursor;

ipSelSet->Search(ipQF,VARIANT_TRUE,&ipCursor); IRowPtr ipRow;

ipCursor->NextRow(&ipRow); m_ipCurFeat = ipRow; m_bSel = FALSE; }

else if(m_bMove) {

IPointPtr ipPoint;

m_ipMPFdbk->Stop(&ipPoint); IGeometryPtr ipGeo(ipPoint);

m_ipCurFeat->putref_Shape(ipGeo); m_ipCurFeat->Store(); m_ipCurFeat=NULL;

m_ipMap->ClearSelection(); m_pAV->Refresh(); m_bMove = FALSE; } }

在View 类的 DoubleClick 事件中添加如下代码:

OnOnDoubleClickControl(long button, long shift, long x, long y, double mapX, double mapY) {

if (NULL==m_ipCurFeat) {

AfxMessageBox(\ return; }

VARIANT var;

CString strFeatName;

CDlgHospital dlg; //这是一个对话框类,提供一个文本框实现要素名称的输入。 m_ipCurFeat->get_Value(1,&var);//取得要素的原值 strFeatName=var.bstrVal; dlg.m_sName=strFeatName; if (dlg.DoModal()!=IDOK) return ;

strFeatName=dlg.m_sName;

m_ipCurFeat->put_Value(1,(_variant_t)strFeatName); m_ipCurFeat->Store(); m_pAV->Refresh(); }

在View 类的 OnKeyDown 事件中添加如下代码: OnOnKeyDownControl(long keyCode, long shift) {

if(NULL==m_ipCurFeat) {

AfxMessageBox(\ return ; }

if(keyCode==VK_DELETE) {

if(AfxMessageBox(\删除选定点?\ return;

m_ipCurFeat->Delete(); m_ipCurFeat=NULL;

m_ipMap->ClearSelection(); m_pAV->Refresh(); } }