MapInfo开发心得——控件篇

前阵做一个项目过程中,需要结合MapInfo进行地方展示开发,积累一点点心得与大家共享
以下所有基于MapXtreme 6.6
MapInfo提供了足够强大的WinForm地图空间,可以很方便地在VS中拖拉摆放。
但如此强大的控件也带来了封闭性太强的问题。
现在我们都接触到了大量Web上的地图,比如Google Map,Live Map等,这些Web地图都具有非常高的交互能力,缩放由鼠标双击或鼠标中键滚动,或者使用缩放工具完成,但换到WinForm上,这些非常好的交互能力全都没有了,变成了一个个冰冷的控件(如下图),需要手动触发才能调用相应功能,这样的功能给用户多大的困扰啊!
需要改变一下了: 
首先在需要使用MapControl的窗体构造一个MapControl对象,并声明如下事件:
ContractedBlock.gifExpandedBlockStart.gif缩放等级改变事件
1ExpandedBlockStart.gifContractedBlock.gif        /**//// <summary>
2        /// 缩放等级改变事件
3         /// </summary>
4        /// <remarks>在本地图的缩放等级发生变化后触发</remarks>

5        public event EventHandler ZoomLevelChanged;

这个事件的使用如下所示:

ContractedBlock.gifExpandedBlockStart.gifCode
ExpandedBlockStart.gifContractedBlock.gif        /**//// <summary>
        
/// 设置地图显示比例
        
/// </summary>
        
/// <remarks>窗体上所有缩放事件均进入该方法进行</remarks>
        
/// <param name="ZoomLevel"></param>

        public void SetZoomLevel (int ZoomLevel)
ExpandedBlockStart.gifContractedBlock.gif        
{
            _helper.Zoom ( ZoomLevel );
            _zoomLevel 
= _helper.ZoomLevel;
            
if ( ZoomLevelChanged != null )
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
//触发事件
                ZoomLevelChanged ( thisnew MapControlEventArg ( _zoomLevel ) );
            }

        }

声明ZoomLevelChanged事件时,为了省事,没有使用相应的委托来做,其实在EventArg处,我使用了一个继承自EventArg的类,并把当前缩放等级值传入其中。
准备工作完成了,那么现在是时候构造地图缩放工具了。
设计思路是这样的:
由于缩放地图具有一定的范围,那么我就把地图的缩放设置为8个等级,并对应MapInfo的缩放距离,该缩放方法使用一个外部类控制:
ContractedBlock.gifExpandedBlockStart.gif设置地图缩放等级
        /// <summary>
        
/// 设置地图缩放层级
        
/// </summary>
        
/// <param name="map">地图实例引用</param>
        
/// <param name="zoomLevel">缩放层级</param>
        private void SetZoomLevel ( Map map,int zoomLevel )
        {
            
try
            {
                map.Zoom 
= ExchangeZoomLevel ( zoomLevel );
            }
            
catch
            { }
        }
点击该缩放控件时,调用的是上面的方法,并把地图控件中的地图引用传递过去,实现缩放功能。
由于MapInfo的MapControl控件已经提供了比较完善的API,使得缩放功能得以方便地实现。
构造缩放控件类,并在类中声明以下变量以供使用
ContractedBlock.gifExpandedBlockStart.gif声明变量
        /// <summary>
        
/// 保存对父控件的引用
        
/// </summary>
        private System.Windows.Forms.Control _control;
        
/// <summary>
        
/// 维护当前的等级Label
        
/// </summary>
        private List<System.Windows.Forms.Label> levelLabelList;
        
/// <summary>
        
/// 控件左上角显示坐标X
        
/// </summary>
        private readonly int xPosition = 10;
        
/// <summary>
        
/// 控件左上角显示坐标Y
        
/// </summary>
        private readonly int oginYPosition = 10;
        
/// <summary>
        
/// 当前缩放等级Label颜色
        
/// </summary>
        private System.Drawing.Color currentLevelLabelColor = System.Drawing.Color.Blue;
        
/// <summary>
        
/// 各控件的ToolTip
        
/// </summary>
        System.Windows.Forms.ToolTip tt;
接下来构造控件的现实状态。由于UserControl或Control类生成出来的控件都会带有默认的矩形背景,这一点都不雅观,所以我还是采用了一个愚蠢方法,在MapControl上直接使用AddControl()。
ContractedBlock.gifExpandedBlockStart.gif构造缩放工具
 1ExpandedBlockStart.gifContractedBlock.gif         /**//// <summary>
 2        /// 构造缩放工具
 3        /// </summary>

 4        public void BuildZoomTool ( )
 5ExpandedBlockStart.gifContractedBlock.gif        {
 6            System.Windows.Forms.Control mc = ( (MapControl) _control ).mapControl;
 7            System.Windows.Forms.Label labelZoomIn = CreateZoomInLabel ();
 8            mc.Controls.Add ( labelZoomIn );
 9            int yPosition = 32;
10            //循环次数与最大缩放等级有关
11            for ( int i = MapHelper.MinZoomLevel; i <= MapHelper.MaxZoomLevel; i++, yPosition += 15 )
12ExpandedSubBlockStart.gifContractedSubBlock.gif            {
13                System.Windows.Forms.Label levelLabel = CreateLevelLabel ( i, yPosition+oginYPosition );
14                levelLabelList.Add ( levelLabel );
15                mc.Controls.Add ( levelLabel );
16            }

17            System.Windows.Forms.Label labelZoomOut = CreateZoomOutLabel ( yPosition+oginYPosition );
18            mc.Controls.Add ( labelZoomOut );
19        }

20
以下是构造Label的方法:
ContractedBlock.gifExpandedBlockStart.gif构造各Label
 1         private System.Windows.Forms.Label CreateLevelLabel ( int zoomLevel,int yPosition )
 2ExpandedBlockStart.gifContractedBlock.gif        {
 3            System.Windows.Forms.Label label = new System.Windows.Forms.Label ();
 4            label.BackColor = System.Drawing.Color.White;
 5            label.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
 6            label.Font = new System.Drawing.Font ( "宋体"15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( (byte) ( 134 ) ) );
 7            label.Text = "      ";
 8            label.Name = "lblLevel" + zoomLevel.ToString ();
 9            label.Tag = zoomLevel;
10            label.Cursor = System.Windows.Forms.Cursors.Hand;
11            label.Location = new System.Drawing.Point ( xPosition, yPosition );
12            label.Size = new System.Drawing.Size ( 3711 );
13            label.Click += new EventHandler ( label_Click );
14            tt = new System.Windows.Forms.ToolTip ();
15            tt.ShowAlways = true;
16            tt.SetToolTip ( label, "缩放地图到"+zoomLevel.ToString()+"" );
17            return label;
18        }

19
以上需要注意的是,我把该控件所关联的缩放等级设置到控件的Tag中,并注册了点击事件,那么在该事件中,我们只需要把该控件所保留的缩放等级设置到地图上就可以了:
ContractedBlock.gifExpandedBlockStart.gifLabel事件
1        void label_Click ( object sender, EventArgs e )
2ExpandedBlockStart.gifContractedBlock.gif        {
3            System.Windows.Forms.Label label = (System.Windows.Forms.Label) sender;
4            MapControl mc = (MapControl) _control;
5            mc.SetZoomLevel ( Int32.Parse ( label.Tag.ToString () ) );
6        }
如此以上,我们的地图缩放工具就完成了。
当然,有了这个工具还是不够的,所以我又在MapControl上注册了鼠标双击事件,由双击鼠标来进行地图的缩放:
ContractedBlock.gifExpandedBlockStart.gifMapControl双击事件
 1        public void mc_Map_MouseDoubleClick ( object sender, MouseEventArgs e )
 2ExpandedBlockStart.gifContractedBlock.gif        {
 3            switch ( e.Button )
 4ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 5                case MouseButtons.Left:
 6                    ZoomIn ();
 7                    break;
 8                case MouseButtons.Right:
 9                    ZoomOut ();
10                    break;
11            }

12            _helper.SetCenter ( e.Location );
13        }

14

这是最后的效果,当点击任意的缩放等级,地图就会缩放到适当的大小

转载于:https://www.cnblogs.com/wuxingsheng1984/archive/2008/11/14/1333460.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下epoll如何实现高效处理百万句柄的

开发高性能网络程序时&#xff0c;windows开发者们言必称iocp&#xff0c;linux开发者们则言必称epoll。大家都明白epoll是一种IO多路复用技术&#xff0c;可以非常高效的处理数以百万计的socket句柄&#xff0c;比起以前的select和poll效率高大发了。我们用起epoll来都感觉挺爽…

89个嵌入式相关概念,你懂了几个?

嵌入式、计算机的学习&#xff0c;最基础的就是弄清一些概念。嵌入式、计算机相关的概念很多&#xff0c;这次汇总整理一些&#xff1a;1. 操作系统&#xff08;Operating System&#xff0c;OS&#xff09;&#xff1a;是管理计算机硬件与软件资源的系统软件&#xff0c;同时也…

每天一个linux命令(lsof)

losf----系统级监控、诊断工具安装&#xff1a;yum install lsof格式&#xff1a;lsof [选项] [绝对路径文件名 | 其他参数]主要选项&#xff1a;D&#xff1a;递归查找除该路径下所有打开的文件[rootroot ~]# lsof D /usr/lib COMMAND PID USER FD TYPE DEVICE SIZE…

正确使用PresentModalViewController

Present ViewController Modally 一、主要用途 弹出模态ViewController是IOS变成中很有用的一个技术&#xff0c;UIKit提供的一些专门用于模态显示的ViewController&#xff0c;如UIImagePickerController等。弹出模态ViewController主要使用于一下这几种情形&#xff1a; 1、…

word 2007 中插入图片无法显示,只能显示底部一部分

故障现象 向正在编辑的Word文档中插入一个图形时&#xff0c;发现插入的图形只显示出了一部分。下半部分&#xff0c;图片上面有文字&#xff0c;还能输入文字和回车。好像图片在文字下面一样&#xff0c;就露出了一个底部。无论怎样调整都不能解决问题&#xff0c;如果用浮…

使用VLC转码,在HTML5页面播放实时监控

首先要获取摄像机品牌的RTSP地址&#xff1a; 如大华的是rtsp://user:pwdip:port/cam/ realmonitor?channel1&subtype0 海康的是rtsp://user:pwdip:port/MPEG-4/ch1/main/av_stream Html5 <video>并不支持rtsp,所以使用vlc进行转码,将rtsp转http流,这样<video&g…

聊聊Linux中线程和进程的联系与区别!

大家好&#xff0c;推荐飞哥的一篇文章&#xff01;关于进程和线程&#xff0c;在 Linux 中是一对儿很核心的概念。但是进程和线程到底有啥联系&#xff0c;又有啥区别&#xff0c;很多人还都没有搞清楚。在网上对进程和线程的讨论中&#xff0c;很多都是聚集在这二位有啥不同。…

Docker swarm 实战-部署wordpress

Docker swarm 实战-部署wordpress 创建一个overlay的网络 docker network create -d overlay demo6imq8da3vcwvj2n499k4bwdlt docker network ls NETWORK ID NAME DRIVER SCOPE feea5ba8507b bridge bridge …

浅谈jQuery的选择器

jQuery的选择器可谓之强大无比&#xff0c;这里简单地总结一下常用的元素查找方法 $("A B") 查找A元素下面的所有子节点&#xff0c;包括非直接子节点 $("A>B") 查找A元素下面的直接子节点 $("AB") 查找A元素后面的兄弟节点&#xff0c;包括非…

注册广播

动态注册&#xff1a;detectionSDkBroadcastReceiver new DetectionSDkBroadcastReceiver();IntentFilter intentFilter new IntentFilter();intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);intentFilter.addAction(Intent.ACTION_MEDIA_EJECT);intentFilter.addDataS…

2018年上半年总结

2018年上半年即将过去&#xff0c;在这半年里经历了很多的事情&#xff0c;让自己在各方面成长了很多&#xff0c;但也失去了很多&#xff0c;有些事情让我刻骨铭心&#xff0c;也让我明白了很多的事情&#xff0c;包括&#xff1a;家庭、工作、生活、相处等。 先说下工作上的事…

比GDB方便n倍的调试工具——CGDB

CGDB 是GDB的前端&#xff0c;在终端窗口中意图形化的形式来调试代码(基于ncurse)&#xff0c;非常方便。相对于GDB来说&#xff0c;可以很大的提高效率。这篇文章就来分享一下CGDB的最基本使用方法&#xff0c;如果是第一次听说&#xff0c;强烈建议您体验一下&#xff0c;一定…

linux--切换ipython解释器到python3

Ipython修改为python3解释器&#xff1a; which ipython --得到路径 cat 路径--查看执行的解释器版本 sudo gedit 路径--修改解释器版本为python3保存即可&#xff0c;保存的时候提示异常&#xff0c;这个是正常现象&#xff0c;实际上已经保存成功。测试 which ipython 路径 c…

数据库中字段类型Number(n,m)大概说明

number可以存储浮点数&#xff0c;也可以存储整数。Number(n,m) int类型只能存放整数。 a、number(4,3)是表示这个数一共有4位是有效位,后面的3表示有3个是小数也就是这个数&#xff0c;只能是1.234,这样格式的最大只能是9.999,b、number&#xff08;3,4&#xff09; 表示这个…

WCF Security userName/Password

1. Transfer SecurityTransfer Security 主要包括三个方面&#xff1a; "消息完整性(Message Integrity)"、"消息机密性 (Message Confidentiality)" 和 "交互验证(Mutual Authentication)"。消息完整性必须确保消息在传输过程中没有被篡改&…

Sencha Touch2中数据的获取

根据Sencha Touch技术框架的特点&#xff0c;前台展示的绝大部分数据都是通过ajax方式获取&#xff0c;譬如列表数据的获取、表单数据的获取等等。列表数据的获取&#xff0c;一般是通过store组件和list组件进行结合&#xff1b;表单数据的获取通常使用Ext.request方式获取。列…

boost库中mutex、condition_variable与mutex::scoped_lock联合使用实现线程之间的通信

最近在公司负责一个线程池的模块&#xff0c;里面用到了boost库中的mutex、condition_variable与mutex::scoped_lock&#xff0c;在此总结下线程池在使用时的方式和要点&#xff0c;这里记录了线程之间的通信方式&#xff0c;希望对学习线程之间(同一个进程)通信的同志们有所帮…

caffe运行训练脚本时报错:Unknown bottom blob 'data' (layer 'conv1',bottom index 0)

报错的两种报错原因&#xff1a; 1.输入数的路径错误&#xff0c;需要将路径进行修改排查目录是否出错 2.训练原数据格式不对 3.train.prototxt文件中并未设置test层&#xff0c;而在solver层则设置了test的迭代等参数 两种解决方法 1.对错误原因1&#xff0c;则改为正确路径 2…

保护视力,我写的一个定时提醒的小玩意。

做程序员2年了&#xff0c;感觉视力越来越差。有时候常常工作到忘记休息。于是就想写一个能够定时提醒的小东西(公司不让从网络下载别的程序)。 功能: 1.能够每隔一段时间提醒我休息&#xff0c;做做眼保健操。 2.能够自己设定时间间隔. 运行环境&#xff1a;.ne…

Matrix Computations 1

matrix computation转载于:https://www.cnblogs.com/stoneresearch/archive/2012/06/05/4336290.html