用TocControl和MapControl做了一个测试,现有一个分组层展现在MapControl里,分组层里有个图层假设其为图层A,我将整个分组层的可见状态设为不可见(图层A的实际上也不可见了。)但使用 ILayer.Visible 获得图层A的可见状态时,竟然为True。这是不是因为在Toc控件里图层A仍旧是勾上的缘故?那怎么才能获得图层A的正确的可见状态?
分析:
提到的这个问题,严格来讲是一个bug。对于分组层的子图层,当分组层可见时,直接判断子图层可见性即可,但分组层不可见时,其子图层无论是否勾选均不可见。
解决方案:
根据分析的原理判断图层,VBA代码如下( 注意: 算法未考虑分组层嵌套分组层的场景,且假设图层名称无重复。 )
Code
1' 测试
2Sub Test()Sub Test()
3 Dim mxDoc As IMxDocument
4 Set mxDoc = ThisDocument
5
6 Dim map As IMap
7 Set map = mxDoc.FocusMap
8
9 If mxDoc.SelectedLayer Is Nothing Then
10 MsgBox "无选中图层"
11 End If
12
13 MsgBox GetVisible(map, mxDoc.SelectedLayer)
14End Sub
15
16' 获取图层可见性
17Function GetVisible()Function GetVisible(map As IMap, layer As ILayer) As Boolean
18 For i = 0 To map.LayerCount - 1
19 '如果是一级图层,visible属性一定表示可见性
20 If map.layer(i).Name = layer.Name Then
21 GetVisible = map.layer(i).Visible
22 ElseIf TypeOf map.layer(i) Is ICompositeLayer Then
23 '如果是子图层,一级分组层不可见,其子同层一定不可见;一级分组层可见,可见性以该图层可见性为准
24 Dim cl As ICompositeLayer
25 Set cl = map.layer(i)
26 Dim j As Integer
27 For j = 0 To cl.Count - 1
28 If cl.layer(j).Name = layer.Name Then
29 If map.layer(i).Visible Then
30 GetVisible = layer.Visible
31 Else
32 GetVisible = False
33 End If
34 Exit Function
35 End If
36 Next j
37 End If
38 Next i
39 GetVisible = False
40End Function
41
1' 测试
2Sub Test()Sub Test()
3 Dim mxDoc As IMxDocument
4 Set mxDoc = ThisDocument
5
6 Dim map As IMap
7 Set map = mxDoc.FocusMap
8
9 If mxDoc.SelectedLayer Is Nothing Then
10 MsgBox "无选中图层"
11 End If
12
13 MsgBox GetVisible(map, mxDoc.SelectedLayer)
14End Sub
15
16' 获取图层可见性
17Function GetVisible()Function GetVisible(map As IMap, layer As ILayer) As Boolean
18 For i = 0 To map.LayerCount - 1
19 '如果是一级图层,visible属性一定表示可见性
20 If map.layer(i).Name = layer.Name Then
21 GetVisible = map.layer(i).Visible
22 ElseIf TypeOf map.layer(i) Is ICompositeLayer Then
23 '如果是子图层,一级分组层不可见,其子同层一定不可见;一级分组层可见,可见性以该图层可见性为准
24 Dim cl As ICompositeLayer
25 Set cl = map.layer(i)
26 Dim j As Integer
27 For j = 0 To cl.Count - 1
28 If cl.layer(j).Name = layer.Name Then
29 If map.layer(i).Visible Then
30 GetVisible = layer.Visible
31 Else
32 GetVisible = False
33 End If
34 Exit Function
35 End If
36 Next j
37 End If
38 Next i
39 GetVisible = False
40End Function
41