一个地图标记控件的开发
一, 需求
要做一个组件,供程序调用的,要实现能够调整大小,角度,颜色。用法类似下图中的红框。
比如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事件响应中处理移动,及时刷新控件。