阅读:2603回复:8
Vb.net环境下为地图添加图例!
<P>据我找到的资料似乎只能为PageLayerOut添加图例,例子中的这个函数</P>
<P> Public Function CreateSurround(ByVal pID As UID, ByVal pEnv As IEnvelope, ByVal strName As String, ByVal pMap As IMap, ByVal pPageLayout As IGraphicsContainer) As IMapSurround</P> <P> Dim pGraphicsContainer As IGraphicsContainer Dim pActiveView As IActiveView Dim pMapSurroundFrame As IMapSurroundFrame Dim pMapSurround As IMapSurround Dim pMapFrame As IMapFrame Dim pElement As IElement</P> <P> 'MapSurrounds are held in a MapSurroundFrame 'MapSurroundFrames are related to MapFrames 'MapFrames hold Maps pGraphicsContainer = pPageLayout pMapFrame = pGraphicsContainer.FindFrame(pMap) pMapSurroundFrame = pMapFrame.CreateSurroundFrame(pID, Nothing) pMapSurroundFrame.MapSurround.Name = strName</P> <P> 'Set the geometry of the MapSurroundFrame to give it a location 'Activate it and add it to the PageLayout's graphics container pElement = pMapSurroundFrame pActiveView = pPageLayout pElement.Geometry = pEnv pElement.Activate(pActiveView.ScreenDisplay) pGraphicsContainer.AddElement(pElement, 0)</P> <P> CreateSurround = pMapSurroundFrame.MapSurround End Function</P> <P>我也已经看到了,并且可以实现,可是我只是想用AxMapControl,而不想用AxPageLayerOut,并且我只是想实在点击图例按钮弹出一个窗体,窗体显示各层的图例就可以了,应该用什么方法呢?高手再给指条明路吧!唉</P><img src="images/post/smile/dvbbs/em30.gif" /> |
|
|
1楼#
发布于:2004-05-13 15:13
<P>请教肯定算不上,反正够烦的,帮助不好用确实让人头疼啊!</P><P>一起学习一起探讨啦!呵呵</P><img src="images/post/smile/dvbbs/em07.gif" />
|
|
|
2楼#
发布于:2004-05-13 14:35
<P>OK ,congratulations!</P><P>呵呵,这几天太忙了!又要用Mapgis二次开发一个项目,我真的不想做,因为Mapgis的帮助的确太烂了^_^</P><P>我没接触过.net,落伍了,以后多多向你请教</P>
|
|
|
3楼#
发布于:2004-05-13 14:20
呵呵,搞定了,自己把自己误导了!就是PictureBox1.Handle.ToInt32即可!<img src="images/post/smile/dvbbs/em03.gif" /><img src="images/post/smile/dvbbs/em04.gif" /><img src="images/post/smile/dvbbs/em08.gif" />
|
|
|
4楼#
发布于:2004-05-13 09:55
<P>to kisssy:你好!非常感谢你提供的代码,在VB中测试完全可行,其实一开始我就想自己写,但是最关键的</P><P>pSym.SetupDC picLegend.hDC, Nothing
pSym.Draw pGeo pSym.ResetDC 这个如何把获取的symbol显示出来我不会,所以工作一直有问题,非常感谢你的提示!</P><P>但是我现在的问题是我是在vb.net下开发的,.net中picLegend没有了.hDC的方法,我尝试着用</P><P> Public Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As Integer) As Integer</P><P>pSym.SetupDC(GetDC(PicLegend.Handle.ToInt32), Nothing)</P><P>来做,但是没有效果,什么都没有花出来,唉!我正在想办法,可能是获取句柄有问题,如果你知道给点提示啦!多谢多谢!</P><img src="images/post/smile/dvbbs/em02.gif" /> |
|
|
5楼#
发布于:2004-05-12 16:08
<P>多谢多谢!</P>
<P>我也不是硬不愿意用PageLayerOut,问题是我加Legend在PageLayerOut上以后PageLayerOut总是有啊,这样多难看呢!</P> <P>我只是想实现点击图例按钮弹出一个窗体,窗体显示各层的图例就可以了,不要别的东西!</P> |
|
|
6楼#
发布于:2004-05-12 14:52
<P>To lilysunny:</P><P> 如果你硬是不用PageLayerOut或TOCControl,</P><P> 那只能自己画了:</P><P>下面的代码是一个foreigner(Brian Flood )写的:</P><P><FONT color=#f73809>只是针对SimpleRenderer 的</FONT>;可以参考一下</P><P>//Use a picturebox as a legend drawing area
Private Sub picLegend_Paint() Dim pLayer As ILayer Dim pSym As ISymbol Dim pGeo As IGeometry Dim lTop As Long Dim lLeft As Long Dim lOff As Long lTop = 10 lLeft = 10 lOff = 35 Dim i As Integer For i = 0 To MapControl1.LayerCount - 1 Set pLayer = MapControl1.Layer(i) picLegend.CurrentY = lTop If TypeOf pLayer Is IGroupLayer Then lLeft = 20 picLegend.CurrentX = lLeft Dim pGLayer As IGroupLayer Set pGLayer = pLayer picLegend.ForeColor = vbBlack picLegend.Print pGLayer.Name lTop = lTop + lOff ElseIf TypeOf pLayer Is IFeatureLayer Then lLeft = 40 picLegend.CurrentX = lLeft Dim pGFLayer As IGeoFeatureLayer Set pGFLayer = pLayer picLegend.Print pGFLayer.Name lTop = lTop + 5 Set pGeo = getSymbolGeometry(lLeft, lTop, pGFLayer.FeatureClass.ShapeType) Dim pFR As IFeatureRenderer Dim pSR As ISimpleRenderer Set pFR = pGFLayer.Renderer '*** Simple Renderer, need code for complex renderers etc If TypeOf pFR Is ISimpleRenderer Then Set pSR = pFR Set pSym = pSR.Symbol pSym.SetupDC picLegend.hDC, Nothing pSym.Draw pGeo pSym.ResetDC End If lTop = lTop + lOff Else End If Next End Sub Private Function getSymbolGeometry(lLeft As Long, lTop As Long, iType As esriGeometryType) As IGeometry 'expand this to deal with all geometry types Dim lWidth As Long Dim lHeight As Long lWidth = 25 lHeight = 15 Select Case iType Case esriGeometryPolygon Dim pEnv As IEnvelope Set pEnv = New Envelope pEnv.PutCoords lLeft, lTop, lLeft + lWidth, lTop + lHeight Set getSymbolGeometry = pEnv Case esriGeometryPoint Dim pt As IPoint Set pt = New Point pt.X = lLeft + (lWidth / 2) pt.Y = lTop + (lHeight / 2) Set getSymbolGeometry = pt Case esriGeometryPolyline Dim ln As IPolyline Dim pt1 As IPoint Dim pt2 As IPoint Set pt1 = New Point pt1.X = lLeft pt1.Y = lTop + (lHeight / 2) Set pt2 = New Point pt2.X = lLeft + lWidth pt2.Y = pt1.Y Set ln = New esriCore.Polyline ln.FromPoint = pt1 ln.ToPoint = pt2 Set getSymbolGeometry = ln End Select End Function </P><P>GoodLuck!</P> |
|
|
7楼#
发布于:2004-05-11 17:52
那个是测试版,而且现在已经不提供下载了呀!我总不能等到9出来以后再做这个功能吧,呜!<img src="images/post/smile/dvbbs/em15.gif" />
|
|
|
8楼#
发布于:2004-05-11 14:55
早arcobjectsonline.esri.com不是有两个控件下载吗?TOCControl 可以实现啊,去看看吧
|
|
|