本文转载自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;