VC+AO.docx
- 文档编号:6347411
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:65
- 大小:185.31KB
VC+AO.docx
《VC+AO.docx》由会员分享,可在线阅读,更多相关《VC+AO.docx(65页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC AO
![提示](https://static.bdocx.com/images/bang_tan.gif)