lilysunny
路人甲
路人甲
  • 注册日期2003-08-18
  • 发帖数160
  • QQ
  • 铜币499枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2458回复:8

Vb.net环境下为地图添加图例!

楼主#
更多 发布于:2004-05-10 14:01
<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" />
喜欢0 评分0
黑夜给了你黑色的眼睛,你却拿它来翻白眼!
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15947
  • QQ554730525
  • 铜币25339枚
  • 威望15364点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
1楼#
发布于:2004-05-11 14:55
早arcobjectsonline.esri.com不是有两个控件下载吗?TOCControl 可以实现啊,去看看吧
举报 回复(0) 喜欢(0)     评分
lilysunny
路人甲
路人甲
  • 注册日期2003-08-18
  • 发帖数160
  • QQ
  • 铜币499枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2004-05-11 17:52
那个是测试版,而且现在已经不提供下载了呀!我总不能等到9出来以后再做这个功能吧,呜!<img src="images/post/smile/dvbbs/em15.gif" />
黑夜给了你黑色的眼睛,你却拿它来翻白眼!
举报 回复(0) 喜欢(0)     评分
kisssy
卧底
卧底
  • 注册日期2004-04-18
  • 发帖数235
  • QQ
  • 铜币614枚
  • 威望2点
  • 贡献值0点
  • 银元0个
3楼#
发布于: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>
个人专栏: https://zhuanlan.zhihu.com/c_165676639
举报 回复(0) 喜欢(0)     评分
lilysunny
路人甲
路人甲
  • 注册日期2003-08-18
  • 发帖数160
  • QQ
  • 铜币499枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2004-05-12 16:08
<P>多谢多谢!</P>
<P>我也不是硬不愿意用PageLayerOut,问题是我加Legend在PageLayerOut上以后PageLayerOut总是有啊,这样多难看呢!</P>
<P>我只是想实现点击图例按钮弹出一个窗体,窗体显示各层的图例就可以了,不要别的东西!</P>
黑夜给了你黑色的眼睛,你却拿它来翻白眼!
举报 回复(0) 喜欢(0)     评分
lilysunny
路人甲
路人甲
  • 注册日期2003-08-18
  • 发帖数160
  • QQ
  • 铜币499枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于: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" />
黑夜给了你黑色的眼睛,你却拿它来翻白眼!
举报 回复(0) 喜欢(0)     评分
lilysunny
路人甲
路人甲
  • 注册日期2003-08-18
  • 发帖数160
  • QQ
  • 铜币499枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于: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" />
黑夜给了你黑色的眼睛,你却拿它来翻白眼!
举报 回复(0) 喜欢(0)     评分
kisssy
卧底
卧底
  • 注册日期2004-04-18
  • 发帖数235
  • QQ
  • 铜币614枚
  • 威望2点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2004-05-13 14:35
<P>OK ,congratulations!</P><P>呵呵,这几天太忙了!又要用Mapgis二次开发一个项目,我真的不想做,因为Mapgis的帮助的确太烂了^_^</P><P>我没接触过.net,落伍了,以后多多向你请教</P>
个人专栏: https://zhuanlan.zhihu.com/c_165676639
举报 回复(0) 喜欢(0)     评分
lilysunny
路人甲
路人甲
  • 注册日期2003-08-18
  • 发帖数160
  • QQ
  • 铜币499枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2004-05-13 15:13
<P>请教肯定算不上,反正够烦的,帮助不好用确实让人头疼啊!</P><P>一起学习一起探讨啦!呵呵</P><img src="images/post/smile/dvbbs/em07.gif" />
黑夜给了你黑色的眼睛,你却拿它来翻白眼!
举报 回复(0) 喜欢(0)     评分
游客

返回顶部