MapX记录 - 自定义工具

本文转载自hi.baidu.com/redpanda/blog/category/Mapx

 

关于TMap的编码模式(2)

1、 创建自定义的工具

 

虽然MapX提供了许多工具,但是有些情况下也是不够用的,那么用户就需要创建自己的工具。本来我是想仿照MapX的机制重新写的,那就意味着要在MapX之上再封装一层,时间有限,就没有用这种思路。并且MapX已经提供了一套创建自定义工具的方法。

 

 

编码情景:有一个“添加水滴”的按钮,单击之后,单击地图,那么在鼠标点击的位置就会添加一个水滴标注。

 

 

创建自定义的工具步骤如下:

(1)    定义工具名

Const miMyAddWater = 501;

(2)    创建工具:

在TMap对象初始化的地方创建新建水滴的工具:

m_map.CreateCustomTool( miMyAddWaterTool, miToolTypePoint, miCrossCursor);

 

函数原型:

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

 

各部分说明

l         OBJECT: 表示 Map 对象。

l         ToolNumber:用于在此后引用它的工具的数量。此值必须是介于 1 和 999 之间的整数,在本例中就是miMyAddWater常数。

l         Type:描述工具行为的类型。取值为 ToolTypeConstants 的值,ToolTypeConstants描述了在创建定制工具时,可是使用的工具类型。它们描述了工具的行为

在本例中是miToolTypePoint,指示特定的点。还有其他的选择,如下:

常数                行为

miToolTypePoint     指示特定的点。

miToolTypeLine     绘制线条。

miToolTypeCircle     绘制圆形。

miToolTypeMarquee   绘制选择该框内的地图对象的矩形框。

miToolTypePoly      绘制折线。

miToolTypePolygon   绘制多边形。

l         Cursor:在工具创建时的光标形状是 CurrentTool,并且光标位于地图之上。取值为 CursorConstants 的值或定制光标文件名。

此例中使用miCrossCursor,表示选择工具后,光标变成十字架的样子,还有其他的选择,苦于字数的限制,把这些选项放在下一篇日志里面介绍。好累啊~~~

l         ShiftCursor变量:CursorConstants 值,表示应该在按住 SHIFT 键时出现的光标。可选,如果省略,则 SHIFT 键对于光标没有任何影响。

l         CtrlCursor 变量:CursorConstants 值,表示应该在按住 CTRL 键时出现的光标。可选,如果省略,则 CTRL 键对于光标没有任何影响。

l         InfoTips 布尔值:如果要显示 InfoTips,则设置为 true。默认值为 false。

(3)    代码控制:

定义好工具之后,就要编写代码实现工具的功能。有两个不同的时间可用来执行工具的代码:在该工具使用期间和在该工具使用之后。在我们这个编码情景中,我们是希望在工具使用期间来执行该工具的作用。

可以选择在MyMouseUp 或者MyMouseDown事件中添加实现的代码,推荐使用MyMouseUp,可以避免偶尔不能选中图元的问题。

procedure TFrame_MapView.DoMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);

var

mapX,mapY:Double;

screenX,screenY:Single;

i:Integer;

begin

screenX := X/1.0;

screenY := Y/1.0;

//将屏幕坐标转换成地图坐标

m_map.ConvertCoord(screenX,screenY,mapX,mapY,miScreenToMap);

case m_map.CurrentTool of

miMyAddWaterTool://添加水滴图元

    begin

      //这个函数的具体实现参考《mapX - 基本操作(1)

      addBitMap(m_map, m_map.Layers.Item[‘water’] ,’Water.bmp’ ,mapX,mapY);

    end;

miZoomOutTool: //如果是放大工具

         begin

。。。。。

end;

……

end;

 

 

实现工具的功能大部分是使用上述的模式,这种模式适合在工具使用期间发挥工具的作用。但是还有一种模式:在工具使用之后发生作用,这种模式我很少用,就是使用toolUsed函数。

 

刚刚开始的时候,我以为在toolUsed里面写实现的代码和在mouseUp里面写效果是一样的,经过一些实验才发现不同之处。对于一些例如添加水滴图元之类的工具,在两个地方实现都是一样的效果。但是对于一些复杂操作的工具,例如折线测距工具或者区域绘图工具就不一样了。例如,允许用户绘制一个圆形,并在松开鼠标后,计算该半径内图元的数目。如果这是该工具需要的功能,则使用 Map 对象的 ToolUsed 事件放置实现的代码。

 

(4)    使用该工具:

自定义的工具定义好了,就要使用这个工具。那么如何使用呢? 很简单,只要如下一句话就可以了:

m_map.CurrentTool := miMyAddWaterTool;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值