cl991036
管理员
管理员
  • 注册日期2003-07-25
  • 发帖数5913
  • QQ14265545
  • 铜币29656枚
  • 威望213点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • GIS帝国铁杆
阅读:1693回复:6

VB中利用MapX创建用户定制工具

楼主#
更多 发布于:2003-08-03 00:52
利用MapX4.0创建用户定制工具分为以下三步:

  2.1 创建定制工具

  本例创建的是画椭圆工具。首先,宣称全局常量miAddEllipseTool = 1,1就代表了画椭圆这个工具。然后,在主窗体中创建画椭圆工具。
关键方法(创建定制工具):

OBJECT.CreateCustomTool (ToolNumber, Type, Cursor, [ShiftCursor] , [CtrlCursor], [InfoTips])

  OBJECT(对象):Map对象;

  ToolNumber(工具号)是创建出代表画椭圆工具的miAddEllipseTool;

  Type(类型):描述了工具的行为,这个参数取的ToolTypeConstants(工具类型常量)值。本例,工具是按下鼠标左键到弹上鼠标左键的过程中画椭圆。本例中取的是miToolTypePoint;

  Cursor(指针形状):使用该工具时,该工具在地图上显示的形状,该参数从CursorConstants(指针常量)中取值。本例选用的是miCrossCursor,那么当选择该工具时,该工具将在地图上显示成十字叉形状;

  ShiftCursor ,CtrlCursor:这两个参数是可选的,缺省情况时,SHIFT键和CTRL键不起作用;

  InfoTips(工具提示): Boolean型。 如果要显示工具提示,需要将此参数设为true;缺省值为false。

  实际编码:

Public Const miAddEllipseTool = 1 '定制的加椭圆工具
Public RectX1 As Double '新加椭圆(所需的矩形)的点1的X(经纬度)坐标
Public RectY1 As Double '新加椭圆(所需的矩形)的点1的Y(经纬度)坐标
Public RectX2 As Double '新加椭圆(所需的矩形)的点2的X(经纬度)坐标
Public RectY2 As Double '新加椭圆(所需的矩形)的点2的Y(经纬度)坐标
Private Sub Form_Load() '创建定制工具
Map1.CreateCustomTool miAddEllipseTool, _
miToolTypePoint, miCrossCursor
End Sub

  此时所创建的工具没有任何功能,要工具具备相应的功能由第二步实现。
 2.2编写工具句柄 (工具具备什么功能)。

  当按下鼠标左键时,需要记下椭圆的起始位置;当鼠标右键弹上时,需要记下椭圆的结束位置,这时,画出椭圆。椭圆将以这两点为矩形的对角线在矩形框中绘制椭圆。需要特别注意的是,MapX4.0中使用的坐标系统是经/纬度系统,而MouseDOwn,MouseUp事件中的坐标是屏幕坐标,因此,需要将屏幕坐标转化为经/纬度坐标,所画椭圆才能显示在正确的位置上。

  关键方法(绘制椭圆):

OBJECT.CreateEllipticalRegion(Rectangle,[Angle] , [Resolution] , [Style] )
OBJECT:FeatureFactory对象;
Rectangle(矩形):Rectangle对象,确定了椭圆的大小;
Angle(角度):变量,决定椭圆绕中心点旋转的角度;
Resolution(精度) :变量, 椭圆的精度,由多少点构成;
Style(样式): 变量,定义了所画椭圆的样式,如颜色,线型等。
实际编码:
Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton And (Map1.CurrentTool = miAddEllipseTool) Then
 Map1.NumericCoordSys.Set miLongLat, 0
 '将屏幕坐标转变为经纬度坐标
 Map1.ConvertCoord X, Y, RectX1, RectY1, miScreenToMap
 End if
End Sub
Private Sub Map1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
 If Button = vbLeftButton And (Map1.CurrentTool = miAddEllipseTool) Then
  '将地图的坐标系统设为经/纬度坐标
  Map1.NumericCoordSys.Set miLongLat, 0
  '将屏幕坐标转变为经纬度坐标
  Map1.ConvertCoord X, Y, RectX2, RectY2, miScreenToMap
  '鼠标弹起时,画椭圆
  Call AddEllipse(form1,RectX1,RectY1,RectX2,RectY2)
 Endif
End sub

'画椭圆过程
Public Sub AddEllipse(frm As Form, x1 As Double, _
y1 As Double,x2 As Double,y2 As Double, EditLayer As Variant)
 Dim RECT As New MapXLib.Rectangle '画椭圆的矩形框
 Dim CreatedEllipse As Feature '所画的椭圆
 Dim I as integer,EditLayer as integer
 '设置画椭圆的矩形框
 RECT.Set x1, y1, x2, y2
 With frm.Map1
  '创建椭圆
  Set CreatedEllipse = .FeatureFactory. _
  CreateEllipticalRegion(RECT, , 500, .DefaultStyle)
  '确定哪一层是可编辑层,椭圆只能画在可编辑层上
  For I=1 to .map1.layers.count
   If .map1.layers(I).editable=true then
    Editlayer=I
    Exit for
   Endif
  Next I
  '将椭圆添加到所画的图层上
  .Layers.Item(EditLayer).AddFeature CreatedEllipse
 End With
End Sub
 


  此时,画椭圆工具具备了画椭圆的功能,运用定制的这个工具由第三步实现。

  2.3调用定制工具

  '设置当前工具为定制的画椭圆工具

  Map1.CurrentTool=miAddEllipse

  或 Map1.currenttool=1

  3. 结束语

  本例画椭圆时,从鼠标按下,一直到鼠标最后弹起时才可以看到椭圆出现在地图上,这就是说在鼠标移动(MouseMove事件)时,从鼠标按下,到鼠标弹起的中间过程是看不到中间过程的椭圆出现的。为了实现在鼠标移动时,也可以看到椭圆,那么需要在MouseMove事件中画椭圆,并且,每次画椭圆时删除掉前一次画的椭圆。这样的运行结果就是看到,从鼠标按下,到鼠标弹起的过程中,随鼠标的移动而有了绘椭圆的变化过程。

   另外,本文是以VB5为例,进行的编程,但对于其它语言,如VC++,Delphi等,编程思路和关键方法都是相同的。
喜欢0 评分0
没钱又丑,农村户口。头可断,发型一定不能乱。 邮箱:gisempire@qq.com
sulin
路人甲
路人甲
  • 注册日期2003-07-28
  • 发帖数158
  • QQ
  • 铜币501枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2003-08-04 17:45
顶!
举报 回复(0) 喜欢(0)     评分
echo2003
点子王
点子王
  • 注册日期2003-07-28
  • 发帖数2453
  • QQ76947571
  • 铜币5473枚
  • 威望1点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
2楼#
发布于:2003-08-09 21:04
up!
举报 回复(0) 喜欢(0)     评分
yansike
路人甲
路人甲
  • 注册日期2003-07-30
  • 发帖数60
  • QQ
  • 铜币279枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2003-08-20 12:45
支持
举报 回复(0) 喜欢(0)     评分
袁绍伦
路人甲
路人甲
  • 注册日期2003-08-08
  • 发帖数654
  • QQ164646905
  • 铜币1336枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2003-08-23 01:15
谢谢了
愿意和大家交朋友! QQ:47559983 MSN:shaolun_yuan@hotmail.com eMail:shaolun-yuan@163.com
举报 回复(0) 喜欢(0)     评分
野原美雅
路人甲
路人甲
  • 注册日期2003-10-28
  • 发帖数228
  • QQ
  • 铜币167枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2003-10-30 10:47
举报 回复(0) 喜欢(0)     评分
chaimin1400
路人甲
路人甲
  • 注册日期2003-10-11
  • 发帖数315
  • QQ
  • 铜币533枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2003-11-26 08:59

我喜欢
举报 回复(0) 喜欢(0)     评分
游客

返回顶部