分享
 
 
 

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

王朝厨房·作者佚名  2007-01-04
窄屏简体版  字體: |||超大  

摘要 本文介绍了VB中如何利用MapX创建用户定制地图工具,详细地说明了整个创建过程,以及在创建定制工具的过程中所使用的关键方法。

1.前言

随着地理信息系统的发展,国内外已出现了不少GIS(地理信息系统)软件,其中MapX是MapInfo公司的ActiveX控件产品。由于它是一种基于Windows操作系统的标准控件,因而MapX4.0支持绝大多数标准的可视化开发环境,如:VisualBasic,Delphi,PowerBuilder,VisualC++等面向对象语言,而且可以使用Lotus Script将MapX4.0嵌入到Lotus Notes中。

虽然MapX4.0提供了许多标准工具,可以直接使用,但是很多情况下,这些标准工具不能满足实际的需要,这就要求通过定制地图工具来规定工具能完成何种功能,例如画椭圆工具,标尺工具(测线段长度)等等。下面,笔者就通过一具体实例来介绍一下VB中采用MapX4.0控件制作地图的定制工具。

2.VB环境下MapX编程

利用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等,编程思路和关键方法都是相同的。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有