VC+AO.docx

上传人:b****5 文档编号:6347411 上传时间:2023-01-05 格式:DOCX 页数:65 大小:185.31KB
下载 相关 举报
VC+AO.docx_第1页
第1页 / 共65页
VC+AO.docx_第2页
第2页 / 共65页
VC+AO.docx_第3页
第3页 / 共65页
VC+AO.docx_第4页
第4页 / 共65页
VC+AO.docx_第5页
第5页 / 共65页
点击查看更多>>
下载资源
资源描述

VC+AO.docx

《VC+AO.docx》由会员分享,可在线阅读,更多相关《VC+AO.docx(65页珍藏版)》请在冰豆网上搜索。

VC+AO.docx

VC+AO

1[VC+AE系列]实现对图层的标注、简单渲染

∙标注图层:

1.voidCAOTestView:

:

OnCartoLabel() 

2.{

3.//TODO:

Addyourcommandhandlercodehere

4.

5.HRESULThr;

6.IMapPtrpMap=m_ctrlMap.GetMap();  //m_ctrlMap是MapControl的控件变量

7.ILayerPtripLayer=NULL;

8.pMap->get_Layer(m_ctrlMap.GetLayerCount()-1,&ipLayer);//获取最后的图层

9.

10.ILabelEngineLayerPropertiesPtrpLBProp;

11.IAnnotateLayerPropertiesPtrpALProp;

12.IAnnotateLayerPropertiesCollectionPtrpALProps;

13.IGeoFeatureLayerPtrpGeoFeatLyr=ipLayer;

14.

15.if(NULL==pGeoFeatLyr)

16.return;

17.hr=pGeoFeatLyr->get_AnnotationProperties(&pALProps);

18.hr=pALProps->QueryItem(0,&pALProp,NULL,NULL);

19.if(NULL==(pLBProp=pALProp))

20.return;

21.pLBProp->put_IsExpressionSimple(VARIANT_TRUE);

22.pLBProp->put_Expression((_bstr_t)"[Height]");//设置标注字段,大家拷过去时要改下字段名

23.

24.//创建标注符号

25.IFormattedTextSymbolPtrpFormatTxtSym(CLSID_TextSymbol);

26.

27.

28./////////////////自己设置符号的样式///////////////////////

29.////设置标注的字体

30.//IFontPtrpFont(__uuidof(StdFont));;

31.//pFont->put_Name((_bstr_t)"CourierNew");//字体集

32.//CYcy;

33.//cy.Hi=10*72;

34.//cy.Lo=8*72;

35.//pFont->put_Size(cy);

36.//pFont->put_Bold(TRUE);

37.//pFormatTxtSym->put_Font((IFontDispPtr)pFont);

38.// 

39.////设置标注的颜色

40.//IColorPtrpColor;

41.//pFormatTxtSym->get_Color(&pColor);

42.//hr=pColor->put_RGB(RGB(0,120,0));//深绿色

43.//if(FAILED(hr))return;

44.//hr=pFormatTxtSym->put_Color(pColor);

45.

46./////////////////从样式库文件中获取符号的样式/////////////////////////

47.IStyleGalleryItemPtrpSGitem=NULL;

48.IEnumStyleGalleryItemPtrpEnumSGitem;

49.IStyleGalleryPtrpStyleGall(CLSID_ServerStyleGallery);

50.IStyleGalleryStoragePtrpSGstorage(pStyleGall);

51.CStringstrStyleFile="C:

\\ProgramFiles\\ArcGIS\\Styles\\ESRI.ServerStyle";

52.CStringstrStyleClass="TextSymbols";

53.

54.//获取样式文件

55.pSGstorage->put_TargetFile((_bstr_t)strStyleFile);

56.pStyleGall->get_Items((_bstr_t)strStyleClass,(_bstr_t)strStyleFile,

57.(_bstr_t)"",&pEnumSGitem);

58.if(NULL==pEnumSGitem)

59.{

60.MessageBox("获取样式集失败!

");

61.return;

62.}

63.

64.BSTRbsName;

65.pEnumSGitem->Reset();

66.pEnumSGitem->Next(&pSGitem);

67.

68.if(NULL==pSGitem)

69.{

70.MessageBox("获取样式项失败!

");

71.return;

72.}

73.IUnknownPtrpUnk;

74.pSGitem->get_Item(&pUnk);

75.if(NULL==(pFormatTxtSym=pUnk))

76.{

77.return;

78.}

79.

80.pLBProp->putref_Symbol(pFormatTxtSym);

81.pGeoFeatLyr->put_DisplayAnnotation(VARIANT_TRUE);//显示标注

82.

83.IActiveViewPtrpAV=m_ctrlMap.GetActiveView();

84.pAV->Refresh();

85.}

复制代码

∙渲染图层

渲染前:

 

渲染后:

1.voidCAOTestView:

:

OnCartoRender() 

2.{

3.//TODO:

Addyourcommandhandlercodehere

4.

5.HRESULThr;

6.IActiveViewPtripAV=m_ctrlMap.GetActiveView();

7.IMapPtripMap=m_ctrlMap.GetMap();

8.ILayerPtripLyr;

9.

10.hr=ipMap->get_Layer(0,&ipLyr);//图层要点状的

11.if(FAILED(hr))

12.  return;

13.

14.//简单渲染

15.ISimpleRendererPtripSimpleRnder;

16.IFeatureRendererPtripRnder;

17.IGeoFeatureLayerPtripGeoFeaLyr;

18.

19.if((ipGeoFeaLyr=ipLyr)==NULL)

20.  return;

21.hr=ipGeoFeaLyr->get_Renderer(&ipRnder);

22.if((ipSimpleRnder=ipRnder)==NULL)

23.{

24.  hr=ipSimpleRnder.CreateInstance(CLSID_SimpleRenderer);

25.  if(FAILED(hr))

26.  return;

27.  ipRnder=ipSimpleRnder;

28.}

29.

30.

31.//创建一个简单的点状符号

32.ISimpleMarkerSymbolPtripSymbol(CLSID_SimpleMarkerSymbol);

33.

34.IColorPtripColor; 

35.hr=ipSymbol->get_Color(&ipColor);

36.if(FAILED(hr)) 

37.  return;

38.hr=ipColor->put_RGB(RGB(255,0,0));//红色

39.if(FAILED(hr)) 

40.  return;

41.hr=ipSymbol->put_Color(ipColor);

42.if(FAILED(hr)) 

43.  return;

44.hr=ipSymbol->put_Style(esriSMSCircle);//圆形

45.if(FAILED(hr)) 

46.  return;

47.

48.//设置渲染

49.hr=ipSimpleRnder->putref_Symbol((ISymbolPtr)ipSymbol);

50.if(FAILED(hr))  return;

51.hr=ipSimpleRnder->put_Label((_bstr_t)"CSU_DXC");

52.if(FAILED(hr))  return;

53.hr=ipGeoFeaLyr->putref_Renderer(ipRnder);

54.if(FAILED(hr))  return;

55.

56.hr=ipAV->ContentsChanged();

57.hr=ipAV->Refresh();

58.if(FAILED(hr))  return;

59.}

复制代码

[ 本帖最后由dxcgis于2008-7-3117:

16编辑 ]

AOTest_StyleManager.JPG (61.55KB)

StyleManager=ArcMap中的样式管理器

2[VC+AE 系列]实现要素的编辑、移动、删除等功能

  具体操作步骤:

一、选取要素。

 通过鼠标在MapControl中拉框选取要素(同时按住shift键)。

二、进行编辑、移动、删除操作。

  编辑:

 1、在MapControl中双击,弹出对话框,对话框默认显示要素原值。

 2、在对话框中输入要素的新值。

 

 3、单击OK完成编辑。

  

  移动:

选中要素后,按住鼠标拖动到合适的位置即可。

  删除:

选中要素后,按Delete键删除要素。

定义变量

BOOLm_bMove;

BOOLm_bSel;

IScreenDisplayPtripDisp;

IActiveViewPtrm_pAV;

IMapPtrm_ipMap;

IFeatureLayerPtr  m_ipFeatLyr; 

IMovePointFeedbackPtr  m_ipMPFdbk;  //移动点Feedback

INewEnvelopeFeedbackPtrm_ipNEFdbk;  //新矩形框Feedback

IFeaturePtr  m_ipCurFeat;

初始化设置(可在相应的菜单事件中添加) 

  m_pAV=m_ctrlMap.GetActiveView();

  m_ipMap=m_ctrlMap.GetMap();

//取得图层

  ILayerPtripLayer;

m_ipMap->get_Layer(0,&ipLayer); 

m_ipFeatLyr=ipLayer;

//设置编辑图层为唯一可选,此处设TOC中最上面的图层为编辑图层

hr=m_ipMap->ClearSelection();

if(FAILED(hr)) 

  returnFALSE;

longnLyrCnt;

m_ipMap->get_LayerCount(&nLyrCnt);

for(longi=0;i

{

  m_ipMap->get_Layer(i,&ipLayer);

  IFeatureLayerPtripFeatLyr=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(longbutton,longshift,longx,longy,doublemapX,doublemapY)

{

  if((shift!

=1)//未按shift键则返回

 return;

HRESULThr;

IPointPtripCurPnt(CLSID_Point);

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

if(FAILED(hr)) 

  return;

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

if(NULL==m_ipCurFeat)

{

  m_ipNEFdbk->Start(ipCurPnt);

  m_bSel=TRUE;

}

else

{

  IGeometryPtripGeo;

  hr=m_ipCurFeat->get_Shape(&ipGeo);

  IPointPtripPoint(ipGeo);

  m_ipMPFdbk->Start(ipPoint,ipCurPnt);

  m_bMove=TRUE;

}

}

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

OnOnMouseMoveControl(longbutton,longshift, 

 longx,longy,doublemapX,doublemapY)

{  

  if((shift!

=1)  //未按shift键则返回

 return;

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

  return;

IPointPtripPoint(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);

elseif(m_ipMPFdbk!

=NULL&&m_bMove)

  m_ipMPFdbk->MoveTo(ipPoint);

}

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

OnOnMouseUpControl(longbutton,longshift, 

 longx,longy,doublemapX,doublemapY)

{  

  if((shift!

=1)  //未按shift键则返回

 return;

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

  return;

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

{

  IEnvelopePtripEnv;

  m_ipNEFdbk->Stop(&ipEnv);

  m_ipMap->SelectByShape(ipEnv,NULL,VARIANT_TRUE);

  m_pAV->PartialRefresh(esriViewGeoSelection,NULL,NULL);

  IFeatureSelectionPtripFeatSel(m_ipFeatLyr);

  ISelectionSetPtripSelSet;

  ipFeatSel->get_SelectionSet(&ipSelSet);

  //搜索光标可以获取用查询过滤确定的行

  IQueryFilterPtripQF(CLSID_QueryFilter);

  ICursorPtripCursor;

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

  IRowPtripRow;

  ipCursor->NextRow(&ipRow);

  m_ipCurFeat=ipRow;

  m_bSel=FALSE; 

}

elseif(m_bMove)

{

  IPointPtripPoint;

  m_ipMPFdbk->Stop(&ipPoint);

  IGeometryPtripGeo(ipPoint);

  m_ipCurFeat->putref_Shape(ipGeo);

  m_ipCurFeat->Store();

  m_ipCurFeat=NULL;

  m_ipMap->ClearSelection();

  m_pAV->Refresh();

  m_bMove=FALSE;

}

}

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

OnOnDoubleClickControl(longbutton,longshift,longx,longy,doublemapX,doublemapY)

{

if(NULL==m_ipCurFeat)

{

  AfxMessageBox("FeatureisNull");

  return;

}

VARIANTvar;

CStringstrFeatName;

CDlgHospitaldlg;  //这是一个对话框类,提供一个文本框实现要素名称的输入。

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(longkeyCode,longshift)

{

if(NULL==m_ipCurFeat)

{

  AfxMessageBox("FeatureisNull");

  return;

}

if(keyCode==VK_DELETE)  

{

  if(AfxMessageBox("删除选定点?

",MB_OKCANCEL)==IDCANCEL)

  return;

  m_ipCurFeat->Delete();

  m_ipCurFeat=NULL;

  m_ipMap->ClearSelection();

  m_pAV->Refresh();

}

}

3VC+AE实现TocControl图层拖放功能

在mousedown事件中

要将ITocControl和ITocControlDefault的变量m_ipTocControl和m_TocControl关联

voidCHngdView:

:

OnMouseDownToccontrol1(longbutton,longshift,longx,longy) 

{

//TODO:

Addyourcontrolnotificationhandlercodehere

HRESULThr;

IGroupLayerPtrgrouplayer(CLSID_GroupLayer);

enumesriTOCControlItem  ItemType;  //枚举型的变量

ItemType=esriTOCControlItemNone;

CPointpt;

IBasicMapPtrBasicMap=NULL;

LPUNKNOWNpUnk;

VARIANTData;

m_ipTocControl=m_TocControl.GetObject(); //给m_ipTOC赋值,  m_ipTOC是ITOCControl接口,在CView类中声明

IBasicMapPtripMap; 

VariantInit(&Data);

hr=m_ipTocControl->HitTest(x,y,&ItemType,&ipMap,&m_ipLayer,&pUnk,&Data);

if(FAILED(hr))

  return;

if(button==2&&ItemType==esriTOCControlItemLayer)

{

  pt.x=x;

  pt.y=y;

  CMenumenu;

  menu.LoadMenu(IDR_POPMENU);

  CMenu*pPopup=menu.GetSubMenu(0);

   ClientToScreen(&pt);

   pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pt.x+10,pt.y+5,this);

}

elseif(button==1&&m_ipLayer!

=NULL)

{

  m_drag=true;

  ILayerPtrtmpLayer;

  longcount;

  hr=ipMap->get_LayerCount(&count);

  for(inti=0;i<=count;i++)

  {

  hr=ipMap->get_Layer(i,&tmpLayer);

  grouplayer->Add(tmpLayer);

  

  if(tmpLayer==m_ipLayer)

  {

  m_layerindex=i;

  }

  }

  m_GroupLayer=grouplayer;

}

}

在mousemove事件中

if(m_drag==true)

{

  HR

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1