一个地图标记控件的开发

一, 需求

要做一个组件,供程序调用的,要实现能够调整大小,角度,颜色。用法类似下图中的红框。

 比如VB程序有个地图,在程序运行期间能够实现控件的添加、移动、旋转、缩放、删除、保存。

 图中可以放置图标。

二, 需求分析

1)        控件具有长宽、角度、颜色(线框、填充)、粗细、可编辑等属性。

2)        控件具有创建、消除、移动、旋转等方法。

3)        控件移动和旋转时底色透明,不遮盖底图。

4)        控件能在程序运行期生成,由代码控制。控件布局能保存和载入。

5)        控件能显示指定图标。

三, 实现思路

在Delphi中封装ActiveX控件,在VB中调用。

序号

名称

路径

用途

1

原始控件

TRotateImageV154

实现图像旋转

2

控件修改

TRotateImageV154(MOD)

1,将RotImg.pas中TRotateImage从TGraphicControl继承,改为从TCustomControl继承

2,为使其底色透明,增加CreateParams和WMEraseBkGnd方法。

3

控件安装

将以上TRotateImage类安装为Delphi面板控件

用于下一步生成activeX控件

4

生成activeX控件

delphi控件(MOD)

1,        从TRotateImage控件生成TRotateImageX这个TActiveXControl控件。编译OCX并注册,以便用于VB环境

2,        增加IRotateImageX 类型库的方法和属性

3,        增加鼠标操作响应函数

4,        其它

四, 测试结果

支持的最大矩形数目1500个,每个矩形控件约消耗内存60K。

矩形个数

操作类型

耗时(秒)

内存消耗(M

程序是否可正常工作

500

生成

正常

删除

正常

载入

正常

1000

生成

8

60

正常

删除

3

正常

载入

8

60

正常

1500

生成

12

90

正常

删除

4

正常

载入

12

90

正常

2000

生成

16

120

有时正常有时不正常

删除

6

载入

17

有时正常有时不正常

装载1000个控件前:

 

装载1000个控件后:

 

  

装载1500个矩形后:

 

  

生成2000个矩形后:

 

  

装载2000个矩形后

删除生成的2000个矩形,再次装载2000个矩形后,出现操作错误:

五, 总结

1,原控件TRotateImage从TGraphicControl继承,不能直接封装ActiveX控件,只能封装为activeForm控件。因为多了一个Form,造成控件操作时背景色不透明等一系列问题。因此将TRotateImage改为从TCustomControl继承非常关键。

2,控件的背景色透明通过重写CreateParams和WMEraseBkGnd方法实现,但也造成控件在移动或旋转时背景不刷新也不透明的问题,最终也没能解决。好在控件操作完毕后显示正常。

3,控件的移动一开始采用Perform(WM_SYSCOMMAND, $F012, 0)这个方法,写起来简单。但发现移动完毕也不刷新背景,程序也无法控制。因此改在mousedown,mousemove,mouseup事件响应中处理移动,及时刷新控件。

原文地址:https://www.cnblogs.com/jackkwok/p/7380748.html