发表用户:jian_1949
收集整理:James.Liu
相关讨论:http://www.mygis.com.cn/forum/dispbbs.asp?boardID=4&ID=8693
信息原始来源:不祥

文章标题:MapX工具概述



内置工具

使用MapX,你能够轻松地把普通的工具栏按钮应用到你的应用中。MapX 为多个常用地图化工具提供了内置支持,其中包括:
 用户更改地图的比例和/或位置的导航工具(放大、缩小、漫游、居中)。
 用户单击地图图元来进行标注的标注工具。
 给予用户不同的方式来选择地图图元的选择工具集合。
对象创建工具,可创建地图图元。
选择工具为修改键(SHIFT 键、CTRL 键)提供内置支持:按住 SHIFT 键同时使用选择工具,不选中图元;按住 CTRL 键同时使用选择工具,则把图元添加到选择结果中。只要按下修改键,MapX 就会自动地显示不同的光标(加号或减号出现光标旁边),以便用户理解该键的作用。
自定义工具
如果需要一种 MapX 没有提供的工具栏按钮,可以使用 Map.CreateCustomTool 方法来创建自定义工具。
创建自定义工具时,需要控制创建工具的“类型”,即:就是要选择此工具是否允许用户单击,或是单击并拖动来画线,或是单击并拖动来画矩形等等。也可以选择使用自定义工具时显示的光标。
控制当前工具
要设定当前使用的工具,请设置 Map 对象的 CurrentTool 属性.
要激活一个标准工具,请把该属性设为某个 ToolConstants 常量。例如,转到放大工具:
Map1.CurrentTool = miZoomInTool
如要激活自定义工具,请使用在运用 CreateCustomTool 方法时指定的 ToolNumber 值。
Map1.CurrentTool = 99
对象编辑工具
对象编辑工具使用户能在地图图层中创建和修改图元。有四种标准的对象创建工具:添加点、添加线、添加折线和添加区域。这些工具把新的图元添加到那些用 Map.layers.InsertionLayer 属性指定的任一图层上。仅只能有一个插入图层,缺省值是无。当没有插入图层而把当前工具设置成对象创建工具时将会导致错误。
MapX 也支持修改现存的地图图元。对于任何要更改的图层,若要编辑图元,必须把Layer.Editable 属性设为True。这样,内置的箭头工具就能用于在当前的选择结果中移动图元或者调整其大小。若要移动选中的图元,只要简单地单击并拖动。若要改变选中的图元的大小,请用编辑手柄拖动。若要删除选中的图元,请按 Delete 键。

可用的标准工具

 不同的工具将会使鼠标能够完成多种任务。例如,如果当前的工具设成 miLabelTool,那么当单击鼠标时,会在此特指的地图对象上放置标签。鼠标光标将根据正使用的工具更改形状。
这些是 MapX 可用的标准工具:

 工具 常量 描述
 Add Line MiAddLineTool 向插入图层添加线图元
 Add Point MiAddPointTool 单击从而向插入图层添加点图元。
 Add Polyline MiAddPolyLineTool 添加折线图元到插入图层。
 Add Region MiAddRegionTool 添加区域图元到插入图层。 
 Arrow MiArrowTool 单击标题或注释。并且,它也可用在可编辑的图层中移动选中的图元或者改变其大小。
 Center MiCenterTool 单击鼠标使地图居中显示。
 Label miLabelTool  单击图元进行标注。
 Pan MiPanTool 拖动地图并重定位地图的中心。
 Polygon Select MiPolygonSelectTool 单击鼠标画多边形;在多边形内的对象被选中。
 Radius Select MiRadiusSelectTool 拖动鼠标并选中在拖动半径内的图元。
 Rect Select MiRectSelectTool  拖动鼠标选中在矩形内的图元。
 Select Tool MiSelectTool  单击选择图元。
 Symbol MiSymbolTool 放置符号注释。
 Text MiTextTool 放置文本注释。
 Zoom In MiZoomInTool 放大。
 Zoom Out MiZoomOutTool 缩小。

 
第二节 创建自定义工具 

为任何应用创建自定义工具时,通常有三个常用步骤:
1. 创建工具。
2. 编写工具的处理过程(反映工具实际上所做的代码)。
3. 使用工具(把工具交付给用户)。
创建工具
若创建自定义工具,请调用 CreateCustomTool 方法。
以下示例创建了自定义 Ruler 工具。Ruler 工具的用途是确定地图上两点之间的距离。首先我们声明一个等于 500 的常量 RULERTOOLID 来代表我们的自定义工具。然后,当装载该应用的主窗体时,创建该工具。

Const RULERTOOLID = 500 ‘This goes in the General declarations.
Private Sub Form_Load()
Map1.CreateCustomTool RULERTOOLID, miToolTypeLine, miSizeCursor
End Sub
在以上 CreateCustomTool 的调用中,指定了三个必选参数:ToolNumber、Type 和 Cursor。ToolNumber 是创建来代表该工具的 RULERTOOLID 常量。Type 是决定工具行为的 ToolTypeConstants 值。在这里,指定为使用户可以用该工具拖动鼠标来画直线的 miToolTypeLine 常量。Cursor 指定为 miSizeCursor 常量,这意味着当工具被选中时,它会以方向光标的形式出现。
CreateCustomTool 有两个可选的参数,它们也取 CursorConstants 常量值。CursorConstants 指定在自定义工具中可使用的光标。当自定义工具是 CurrentTool 时,由它们定义光标的形状。
说明:请参阅《MapX 参考指南》或联机帮助上关于 CursorConstants 的完整列表。
ShiftCursor 指定当 <SHIFT> 键按下时工具的光标形状。CtrlCursor 指定当 <CTRL> 键按下时光标的形状。如果想让工具行为与这些键相联系时,这两个参数是有用的。
若要使自定义工具成为活动工具,请设置 CurrentTool 属性。例如,可以在 Visual Basic 窗体中放置一个按钮,当用户单击这个按钮,就可以设置 CurrentTool 属性。
 
可用的自定义工具类型
ToolTypeConstants 描述当创建一个自定义工具时可使用的工具类型。它们描述工具的行为(例如,miToolTypeLine 使用户可以画线;miToolTypeCircle 使用户可以画圆等)。

 常量 行为
 MiToolTypePoint 在指定位置显示点。
 MiToolTypeLine 画线。
 MiToolTypeCircle 画圆。
 MiToolTypeMarquee 画选取框,并选在此框中选择地图对象。
 MiToolTypePoly 画折线。
 MiToolTypePolygon 画多边形。
Ruler 自定义工具创建以后,需要为该工具实际要做的编写代码。

编写工具处理过程

工具的代码在两个不同的时刻执行:在工具使用过程中,或者使用工具之后。对于自定义的 Ruler 工具,要在工具使用时执行代码,因为此时正是需工作的时候。
自定义的 Ruler 工具的操作方式为:当用户使用它单击在一个地图位置时,工具的距离测量的开始点被标记。用户按下鼠标按钮并且在地图上移动鼠标,然后把鼠标停在另一个位置。这样标记工具距离测量的终点。然后 Ruler 工具计算两点间的距离。要做到这样,需要在用户按下鼠标按钮时,在地图上移动鼠标时和把鼠标停在另一点时执行 Ruler 工具的代码。要在用户按下鼠标时捕获起始点,需要在 MouseDown 事件中写如下代码:
Dim XDown As Double
Dim YDown As Double
Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
     If Map1.CurrentTool = RULERTOOLID And Button = vbLeftButton Then
        Map1.ConvertCoord X, Y, XDown, YDown, miScreenToMap
End If
End Sub
当用户单击按下鼠标,MouseDown 事件被激活。在 MouseDown 事件中的代码获取用户所单击点的 X,Y 坐标,然后把它从屏幕坐标转化为地图坐标,并储存在全局变量 Xdown 和 Ydown中。Xdown 和 Ydown 代表距离测量的起始点。
要捕获当用户移动鼠标在另一点停下时得到的终止点,需要在 MouseMove 事件中编写代码。
Private Sub Map1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Map1.CurrentTool = RULERTOOLID And Button = vbLeftButton Then
      Dim MapCoordX As Double, MapCoordY As Double
      Map1.MapUnit = miUnitMile
      Map1.ConvertCoord X, Y, MapCoordX, MapCoordY, miScreenToMap
      fMainForm.sbStatusBar.SimpleText = Map1.Distance(XDown, _ 
             YDown, MapCoordX, MapCoordY) & " miles"
End If
End Sub

这段代码将持续执行直到用户停止移动鼠标并释放鼠标按钮。代码执行的最后一次是鼠标停止移动之前在地图上经过的最后一点,也正是距离测量的终止点。把点从屏幕坐标转化到地图坐标,然后使用 Map 对象的 Distance 方法计算两点之间的距离。结果则显示在表状态栏里。
ToolUsed 事件
在许多时候可能都需要在工具使用后再执行工具代码。比如用户画圆,并在鼠标按钮被释放以后,计算在该圆半径内的客户数量。如果这是工具需要的功能,则要使用 Map 对象的 ToolUsed 事件来放置代码。
此示例说明:
 使用 Map.CreateCustomTool 方法创建自定义“line”工具(使用户能拖动鼠标来画线的工具)。
 当用户使用自定义工具时用 ToolUsed 事件实现操作。
' The following code in the Form_Load event of a form with 
' a Map Object (Map1) creates a Custom Tool that is a 
' "line-type" tool (it lets the user click and drag).

Private Sub Form_Load()
    Map1.CreateCustomTool 1, miToolTypeLine, miIconCursor
End Sub


' The following code (ToolUsed event)is called whenever any
' tool is used on the  map.
' If the Current Tool is #1 (created above) then the code
' within the If-Then statement will be true, and we will set the caption of a label "lblDistance" equal to ‘the Distance passed in with the "line-type" tool.

Private Sub Map1_ToolUsed(ByVal ToolNum As Integer, ByVal             X1 As Double, ByVal Y1 As Double, ByVal  X2 As Double, ByVal Y2 As Double, ByVal  Distance As Double, ByVal Shift As      Boolean, ByVal Ctrl As Boolean,  EnableDefault As Boolean)
  If ToolNum = 1 then
   lblDistance.Caption = Str$(Distance)
  End If
End Sub 

把工具交付至用户

若要“把工具交付至用户”,请把 Map 对象的 CurrentTool 属性值设置成该工具:
Map1.CurrentTool = miZoomInTool
-或者-
Map1.CurrentTool = 99  
第三节 创建多边形绘制工具(Polytools)


polytool 是可使用户重复单击的工具例如,画多边形或者折线。
标准的 Polytools

MapX 提供了标准的多边形选择工具。该工具允许用户画多边形,然后选择所有质心落于该多边形内的图元。只有可选图层才能够被搜索,无缝图层、栅格以及用户自定义的图层被忽略。
若要激活该工具,请把 CurrentTool 属性设置为 miPolygonSelectTool(值为 1010)。
当使用这个工具时,PolyToolUsed 事件被激活。若用户双击、按空格或者回车结束多边形 (miPolyToolEnd)时,则执行搜索,并且 miPolyToolEnd(1)将传递给 PolyToolUsed 事件。如果用户是用 ESC 键结束的多边形,则取消查询; miPolyToolEndEscaped(2)传递给 PolyToolUsed 事件。用户可以删除线上所有的节(退格键删除)。当最后一个节被删除后,会发送一个(2)标志。
自定义 Polytools
若要创建自定义 polytool,请调用 CreateCustomTool 方法,并指定 ToolTypeConstants 的值为 miToolTypePoly。
若要激活自定义 polytool,请设置 CurrentTool 属性。
无论何时用户选择你的自定义 polytool 并在地图上使用它,MapX 都会调用 PolyToolUsed 事件。因此,需要把代码添加在 PolyToolUsed 事件过程中,以使你的工具生效。
使用自定义Polytools示例

一旦已经使用了CreateCustomTool方法创建 polytool 工具,就可以看看以下的示例是如何处理 PolyToolUsed 事件的。这个示例让用户在图层1上绘制区域或是线。此示例使用了图元对象。它也用到了Parts对象,在联机帮助和《MapX参考指南》中会对该对象给出解释。

Private Sub map1_PolyToolUsed(ByVal ToolNum As Integer, ByVal Flags As Long, ByVal pts As Object, ByVal Shift As Boolean, ByVal Ctrl As Boolean, EnableDef As Boolean)
    If Flags = miPolyToolBegin Then
   'Someone's beginning the use of a PolyTool... 
    ElseIf Flags = miPolyToolEnd Then
   ' The user finished using a PolyTool by double clicking
        If ToolNum = MY_SUPER_POLYGON_TOOL Then
       ' They used MY_POLYGON_TOOL! Make a new 
       ' region feature and add it to the first layer
    dim f As New Feature
             set f = map1.FeatureFactory.CreateRegion (pts, map1.defaultstyle)
    map1.Layers(1).AddFeature f

        ElseIf ToolNum = MY_SUPER_POLYLINE_TOOL Then
    dim f As New Feature
            map1.Layers(1).AddFeature f
        End If

     ElseIf Flags = miPolyToolEndEscaped Then
   ' The user hit 'Esc' or backspaced all the nodes 
   ' away... don't add anything in.
    End If
    
End Sub