MapInfo集成地图开发及组件式开发
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Draw工具条:
点符号: M_TOOLS_POINT = 1711
直线 : M_TOOLS_LINE = 1712
折线: M_TOOLS_POLYLINE = 1713
弧:
M_TOOLS_ARC = 1716
多边形: M_TOOLS_POLYGON = 1714
椭圆: M_TOOLS_ELLIPSE = 1715
因为存在空格,当MapInfo解析命令行时,能自动检测出msg 包含3个独立的MapBasic语句:Open table, Set Next Document, Map From,MapInfo通过保留关键字Open、Set、Map来辨别 。
3、从MapInfo中查询数据
如果需要查询MapBasic表达式的值,需构造代表该表达式 的字符串。例如,如果希望判断MapBasic的WindowID(0)函数 的返回值,在VB中可以按照如下方式构造:
miApp.do “Set window Info Parent ”& form1.hWnd 重父化信息窗口与重父化地图窗口不同原因:
MapInfo可有多个地图窗口,但只有一个信息窗口。 ② 图例窗口 “Set Next Document ” &地图窗口.hWnd。 再用Create Legend语句 不同于MapInfo的默认图例窗口 自定义的图例窗口不会自动刷新 图例窗口与地图窗口或统计图窗口绑在一起。
启动MapInfo后,就可构造代表MapBasic语句的字符串。 如希望MapInfo执行MapBasic的打开表,需构造如下字符串:
msg=“open table”“world.tab”“Interactive” 然后使用Do方法,向MapInfo发送字符串命令,例如 miApp.do msg ( miApp 为定义的启动MapInfo的全局变量) 可以在一条命令行中合并多个MapBasic语句,利用&连结。
4、定位MapInfo窗口 (1) 重定位MapInfo父窗口 启动MapInfo后,采用MapBasic语句的Set Application Window语句可以使客户程序拥有MapInfo的对话框和错误信 息对话框。
Msg=“Set Application Window ” & Form1.hWnd
8、打印MapInfo集成窗口 应用MapBasic的“PrintWin”语句可以打印MapInfo窗口。
MiApp.do “PrintWin” 也可先利用MapBasic的“Save Window”语句输出一个窗口图 元文件(WMF)来替代地图的打印,然后应用VB的“PrintForm”
9、错误捕获 VB:On Error GoTo VC++:try ….catch….finally
1、启动MapInfo 调用VB的CreateObject()函数,并对返回的VB对象变量进 行赋值,可将该对象定义为全局变量。如: Dim miApp as object Set miApp =CreateObject(“mapinfo.application”)
miApp.do “set application window ” & Form1.hWnd
windowinfo要返回的信息的窗口的整型id号scalemode属性设置为pixels象素6集成mapinfo工具按钮在vb应用程序中可集成mapinfo中所有工具按钮的功能如放大缩小等但是由于不能对mapinfo的工具栏进行重父化因此如果在应用程序中需要工具按钮只能在应用程序开发环境中自己创建
miApp.do “Set Window Info Parent ” & Form1.hWnd
5、允许用户定义地图窗口大小 MapInfo不会依据新窗口的大小自动重新设置地图以填满窗 口,因此要实现改变地图窗口大小的功能,必须利用Windows API函数MoveWindow编写代码来实现
Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, _
缩小:
M_TOOLS_SHRINK = 1706
平移:
M_TOOLS_RECENTER = 1702
信息查询: M_TOOLS_PNT_QUERY = 1707
标注:
M_TOOLS_LABELER = 1708
拖放窗口: M_TOOLS_DRAGWINDOW = 1734
标尺:
M_TOOLS_RULER = 1710
① msg=“WindowID(0)”
② 采用OLE自动化:
Dim result as String
result=miApp.Eval “WindowID(0)”
解释:MapInfo将该字符串解释为MapBasic表达式,确定 该表达式的值,然后以字符串的形式返回给VB应用程序。
注意:MapBasic语句中关键词后的空格, 双引号里面的语 句最后有一个空格,如“set application window ” ,否则与VB 语句连接时将出错!
命令。 Alter Menu…Add Calling OLE 增加 Alter Menu…Remove 删除 可使用Create Menu语句重新定义菜单,并使用“(-”代码作
为新菜单定义。 如删除MapInfo地图窗口中的快捷菜单:
miApp.do "Create Menu ""MapperShortcut"" ID 17 as ""(- "" "
Mymap.do msg
Mymap.do "Map from world"
mapid=Val(miApp.eval(“WindowID(0)”))
重父化窗口为窗口重新指定一个父窗口,指定应用程 序中一控件的句柄,下次当创建MapInfo窗口,使用Map 、Browse、LayOut或Create Legend语句时,新建的窗口 被重父化好了,这些地图窗口就将已指定的应用程序作 为它们的父窗口。
MapInfo集成地图开发
集成地图的概念
1、集成地图开发的概念: 将MapInfo地图窗口集成在用其它语言编写的应用程序中 的开发方式,叫做集成地图开发。 利用其它平台能够调用MapInfo环境下的数据、图形等, 应用程序可以控制集成地图的外观、部分执行过程,甚至生成 完全不同于MapInfo界面的应用程序。 注意: MapInfo在后台运行。 可以用Visul Basic、VC++、Delphi等可视化的开发环境, 集成MapInfo窗口到非MapBasic应用程序中,特别是原有成熟 的应用系统中,增加GIS的功能。
矩形: M_TOOLS_RECTANGLE = 1717
圆角矩形: M_TOOLS_ROUNDEDRECT = 1718
文本: M_TOOLS_TEXT = 1709
框架: M_TOOLS_FRAME = 1719
增加节点: M_TOOLS_ADD_NODE = 1723
7、子定义MapInfo快捷菜单 可以使用MapBasic语句增加/删除快捷菜单中的一个或多个
集成地图开发是在程序中调用语句(MapBasic语句)来在 后台启动MapInfo应用程序,MapInfo在后台运行,并不显示 启动窗口。集成地图窗口与MapInfo中的地图窗口没有本质的 区别。
在集成地图应用程序中,首先构造代表MapBasic语句的字 符串,然后使用OLE技术或者DDE技术(动态数据交换)将字 符串发送给MapInfo,从而可以操纵MapInfo, MapInfo会像 处理MapBasic语句一样处理这些命令字符串。
miApp.do msg (2) 重定位文件窗口 需要在VB应用程序中集成MapInfo窗口时,需要向MapInfo 发送MapBasic创建窗体的Set Next Document 语句,以及创建 该窗口的MapBasic语句。如:
Msg="Set Next Document Parent " & Form1.hWnd & " Style 1/Style2/Style3 "
10、终止MapInfo的运行 通过CreateObject()创建MapInfo应用程序对象,如果
释放该对象变量,则终止MapInfo的运行。所以miApp应 该作为全局变量,如果是局部变量的话,子程序结束时, miApp就会释放, MapInfo终止运行。
ByVal x As Long, ByVal y As Long, _
ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal bRepaint As Long) As Long
Private Sub Form_Resize()
dim mHwnd as long
Scalemode属性设置为Pixels(象素)
6、集成MapInfo工具按钮 在VB应用程序中可集成MapInfo中所有工具按钮的功能,如 放大、缩小等,但是由于不能对MapInfo的工具栏进行重父化 ,因此如果在应用程序中需要工具按钮,只能在应用程序开发 环境中自己创建。如果希望所创建的VB工具栏按钮能仿效标准 的MapInfo按钮,可以使用MapInfo的RunMenuCommand方法 。可设置信息提示如下:
要调用已运行的MapInfo,则使用GetObject()函数连结 Set mapinfo= GetObjec (, “mapinfo.application”)
CreateObject ()和GetObject()函数均使用OLE自动对象连结 MapInfo,DDE技术在此不做介绍。
2、向MapInfo传送命令
MapInfo集成地图开发
2.2 MapInfo集成地图开发过程
发送MapBasic语句
客户应用程序 VB,VC++
OLE、DDE MapInfo应用程序
MapInfo返回信息—回调
OLE 自动化,不是OLE嵌入 重父化,hWnd
一个简单的示例程序:
MapBasic程序 可选
集成地图的VB编程开发步骤如下:
mHwnd=Val(miApp.Eval(“WindowInfo(FrontWindow(),WIN_INFO_WND)”))
MoveWindow(mHwnd,0,0,ScaleWidth,ScaleHeight,0)
End Sub FrontWindow():返回当前活动窗口的整型ID号. WindowInfo(要返回的信息的窗口的整型ID号)
miApp.RunMenuCommand 1707/M_TOOLS_PNT_QUERY 既可以使用数字,也可使用标识符,若使用标识符,必须在 程序中包含MapBasic头文件,如果开发环境是:
VB——MapBasic.bas; VC++(C++ Builder)——MapBasic.h;
MapBasic——MapBasic.def
Main工具条:
选择:
M_TOOLS_SELECTOR = 1701
矩形选择: M_TOOLS_SEARCH_RECT = 1722
圆选择: M_TOOLS_SEARCH_RADIUS = 1703
多边形选择: M_TOOLS_SEARCH_BOUNDARY = 1704
放大:
Mห้องสมุดไป่ตู้TOOLS_EXPAND = 1705
即使地图窗口重新指定了父窗口,MapInfo仍然能够 维护该窗口,如果部分窗口需要刷新,MapInfo自动刷新 该窗口,因此客户应用程序可以不考虑擦除和刷新重父 化的窗口。
Set Next Document 多个地图窗口
(3) 重定位图例和特殊窗口 ① 特殊窗口 MapInfo包括信息(Info)、标尺(Ruler)、消息(Message)和统 计(Statics)窗口等特殊的浮动窗口,重父化这些窗口,需要 MapBasic的Set Window语句。如:
例如:打开地图窗口,在MapBasic编程中采用Map From 语 句即可。但是,在集成地图应用程序中,必须给出附加的语句 (如Set Next document Parent ),使地图窗口首先成为当前 应用程序的子窗口。该过程通常称为“重父化(reparenting) 窗口”。然后才可以使用Map From 语句打开地图窗口。
msg= “open table”“usa”“Interactive”
msg=msg & ”Set Next Document Parent ” & Form1.hwnd & ”Style1”
msg=msg & “Map from usa”
Miapp.do msg 注意:关键词后面的空格是必要的!
重父化