前阵做一个项目过程中,需要结合MapInfo进行地方展示开发,积累一点点心得与大家共享
以下所有基于MapXtreme 6.6
MapInfo提供了足够强大的WinForm地图空间,可以很方便地在VS中拖拉摆放。
但如此强大的控件也带来了封闭性太强的问题。
现在我们都接触到了大量Web上的地图,比如Google Map,LiveMap等,这些Web地图都具有非常高的交互能力,缩放由鼠标双击或鼠标中键滚动,或者使用缩放工具完成,但换到WinForm上,这些非常好的交互能力全都没有了,变成了一个个冰冷的控件(如下图),需要手动触发才能调用相应功能,这样的功能给用户多大的困扰啊!
需要改变一下了:
首先在需要使用MapControl的窗体构造一个MapControl对象,并声明如下事件:
缩放等级改变事件
这个事件的使用如下所示:
Code
声明ZoomLevelChanged事件时,为了省事,没有使用相应的委托来做,其实在EventArg处,我使用了一个继承自EventArg的类,并把当前缩放等级值传入其中。
准备工作完成了,那么现在是时候构造地图缩放工具了。
设计思路是这样的:
由于缩放地图具有一定的范围,那么我就把地图的缩放设置为8个等级,并对应MapInfo的缩放距离,该缩放方法使用一个外部类控制:
设置地图缩放等级
点击该缩放控件时,调用的是上面的方法,并把地图控件中的地图引用传递过去,实现缩放功能。
由于MapInfo的MapControl控件已经提供了比较完善的API,使得缩放功能得以方便地实现。
构造缩放控件类,并在类中声明以下变量以供使用
声明变量
接下来构造控件的现实状态。由于UserControl或Control类生成出来的控件都会带有默认的矩形背景,这一点都不雅观,所以我还是采用了一个愚蠢方法,在MapControl上直接使用AddControl()。
构造缩放工具
以下是构造Label的方法:
构造各Label
以上需要注意的是,我把该控件所关联的缩放等级设置到控件的Tag中,并注册了点击事件,那么在该事件中,我们只需要把该控件所保留的缩放等级设置到地图上就可以了:
Label事件
如此以上,我们的地图缩放工具就完成了。
当然,有了这个工具还是不够的,所以我又在MapControl上注册了鼠标双击事件,由双击鼠标来进行地图的缩放:
MapControl双击事件
这是最后的效果,当点击任意的缩放等级,地图就会缩放到适当的大小