基于内置形状的可视化绘制

本节内容可以参考文件"\CaseStudy\流程图\可视化流程图\基于内置形状的可视化绘制.Table"

这个示例文件也有两个窗口,
分别是:

1、"流程图设计"窗口用于以可视化的方式绘制流程图。

2、"流程图显示"窗口用于显示绘制好的流程图。

不同的是,这个示例文件使用的是内置形状,而不是GDI+。

两种方式的区别:

1、GDI+的形状可以设置文字,而内置形状不可以,你只能在形状之上再叠加一个纯文字对象

2、内置形状只有少数几个,参考:GeoMap编程参考  绘制非标形状

3、GDI+提供更灵活,可以绘制任意形状,参考:常用流程符号的绘制

4、内置形状的折线和曲线都可以完美触发事件

5、内置形状起来更简单,更稳定可靠

比较两种方式的流程图显示窗口的代码,你会发现使用内置形状的窗口只在AfterLoad事件中设置了代码,整体要简单很多:

'初始化地图控件,不是必须的,只是使得地图控件更适合作为流程图控件使用:
Dim
map As GeoMap = e.Form.Controls("Map1").GeoMap
map.UseGallPetersProjection =
True '采用Gall Peters投影方式
map.Viewport.Limits.MaxLat = 60
'排除高纬度地区,因为高纬度地区变形大
map.Viewport.Limits.MinLat = -60
map.Zoom = 12
'缩放指数设置为12,留足够的区间用于放大和缩小
map.CenterTo( - 159.976654, 49.99558)
'中心点设置在有效区域的左上,因为通常都是往右下绘制,同时也留有一定的余地往左上绘制
'
增加矢量层:
Dim
layer As New VectorLayer()
map.Layers.Add(layer)
layer.Style.Font =
New Font("微软雅黑", 10)
'
加载之前绘制好的流程图:
For
Each dr As DataRow In DataTables("流程图").Select("", "顺序")
   
Select Case dr("类型")
       
Case "Text" '绘制文本
           
Dim mark As VectorPlacemark = map.CreatePlaceMark(dr("位置"))
            mark.Marker.Shape = MarkerShape.Custom
            mark.Marker.CustomShape = map.CreateTextShape(dr(
"文本"))
            layer.Items.Add(mark)
            mark.Tag = dr
           
If dr.IsNull("颜色") = False Then
                mark.Style.ForeColor = Color.FromArgb(dr(
"颜色"))
           
End If
           
If dr.IsNull("背景") = False Then
                mark.Style.BackColor = Color.FromArgb(dr(
"背景"))
           
End If
           
If dr.IsNull("字体") = False Then
               
Dim converter As New FontConverter()
                mark.Style.Font = converter.ConvertFromString(dr(
"字体"))
           
End If
       
Case "Image"
           
Dim mark As VectorPlacemark = map.CreatePlaceMark(dr("位置"))
            mark.Marker.Shape = MarkerShape.Custom
           
Dim img As Image = GetImage(dr("文本"))
           
If img Is Nothing Then
                img = GetImage(
"Reject.ico") '如果找不到图片则绘制一个占位图
           
End If
            mark.Marker.CustomShape = map.CreateImageShape(img)
'对于反复使用的同一个图片,可以考虑将Image存在Var变量或Public变量中
            mark.Marker.Size = img.Size
'New Size(48, 48) '默认图片显示大小为48*48,可自行修改,如果要用不同的大小显示各种图片,可以考虑增加一个尺寸列
            layer.Items.Add(mark)
            mark.Tag = dr
       
Case "Line", "Bezier" '绘制线条或贝塞尔曲线
           
Dim line As VectorPolyline
           
If dr("类型") = "Line" Then
               
If dr("箭头") = 1 Then
                    line = map.CreateLineWithArrow(dr(
"位置"), True) '双箭头
               
ElseIf dr("箭头") = -1 Then
                    line = map.CreateLineWithArrow(dr(
"位置")) '单箭头
               
Else
                    line = map.CreateLine(dr(
"位置")) '无箭头
               
End If
           
Else
               
If dr("箭头") = 1 Then
                    line = map.CreateBezierCurveArrow(dr(
"位置"), True) '双箭头
               
ElseIf dr("箭头") = -1 Then
                    line = map.CreateBezierCurveArrow(dr(
"位置")) '单箭头
               
Else
                    line = map.CreateBezierCurve(dr(
"位置")) '无箭头
               
End If
           
End If
           
If dr.IsNull("颜色") = False Then
                line.Style.Stroke.Color = Color.FromArgb(dr(
"颜色"))
           
Else
                line.Style.Stroke.Color = Color.Green
           
End If
            line.Style.Stroke.Width = 2
           
If dr.IsNull("线型") = False Then
                line.Style.Stroke.Style = dr(
"线型")
           
End If
            layer.Items.Add(line)
            line.Tag = dr
       
Case Else
           
Dim polygon As VectorPolygon
           
Select Case dr("类型")
               
Case "Diamond" '绘制菱形
                    polygon = map.CreateDiamond(dr(
"位置"))
               
Case "Ellipse" '绘制椭圆
                    polygon = map.CreateEllipse(dr(
"位置"))
               
Case "Rectangle" '绘制方形
                    polygon = map.CreateRectangle(dr(
"位置"))
               
Case "Circle" '绘制圆形
                    polygon = map.CreateCircle(dr(
"位置"), True)
           
End Select
           
If polygon IsNot Nothing Then
               
If dr.IsNull("颜色") = False Then
                    polygon.Style.Stroke.Color = Color.FromArgb(dr(
"颜色"))
               
Else
                    polygon.Style.Stroke.Color = Color.Green
               
End If
               
If dr.IsNull("背景") = False Then
                    polygon.Style.BackColor = Color.FromArgb(dr(
"背景"))
               
End If
                polygon.Style.Stroke.Width = 2
               
If dr.IsNull("线型") = False Then
                    polygon.Style.Stroke.Style = dr(
"线型")
               
End If
                layer.Items.Add(polygon)
                polygon.Tag = dr
           
End If
   
End Select
Next

下图是基于内置形状的流程图绘制工具,可以看到除了少些形状,其他看起来都是一样的:



 


本页地址:http://www.foxtable.com/webhelp/topics/6189.htm