zoukankan      html  css  js  c++  java
  • 一个地图标记控件的开发

    一, 需求

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

     比如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事件响应中处理移动,及时刷新控件。

  • 相关阅读:
    Java 8系列之重新认识HashMap
    java的4种引用 强软弱虚
    在java中为什么要把main方法定义为一个static方法?
    JAVA里面的“指针”
    Java中,一切皆是对象!为何数据类型中还分为:基本类型和对象?
    Java集合类框架的基本接口有哪些?
    线程安全 同步方法 同步锁 同步代码块
    static变量 方法 类 和final
    轻松理解数字签名和数字证书的关系
    SSL身份认证原理
  • 原文地址:https://www.cnblogs.com/jackkwok/p/7380748.html
Copyright © 2011-2022 走看看