第11章用MapBasic建立用户系统.docx
《第11章用MapBasic建立用户系统.docx》由会员分享,可在线阅读,更多相关《第11章用MapBasic建立用户系统.docx(24页珍藏版)》请在冰豆网上搜索。
第11章用MapBasic建立用户系统
第11章用MapBasic建立用户系统
11.lMapBasic程序结构
前一章介绍了MapBasic的基本元素,由它们构成MapBasic的不同种类的语句,再由语句组织成程序。
但是MapBasic程序中的语句必须以一个特定的方式被安排,而不是任意的。
例如:
Global语句就不能放在Sub…EndSub结构中,下面给出的是MapBasic程序中不同组件排列顺序的一个典型的格式:
全局级的语句出现在程序的项部
Include“mapbasic.def”
其他的Includc语句
Type…EndType语句
DeclareSub语句
DeclareFunction语句
Define语句
Global语句
…接下来是主过程定义…
SubMain
Dim语句
EndSub
....接着是其他的子过程定义
Sub....
Dim语句
EndSub
......用户函数定义....
Function....
Dim语句
EndFunction
11.2用户界面程序实例
为了能让读者迅速掌握用MapBasic进行应用程序开发的最基本方法,本节将通过剖析一个程序实例来展示MapBasic强大的开发功能。
由于该程序只是一个演示程序,所以它的重点只放在用户界面的创建。
对于其他一些辅助功能,本程序只提供了功能框架,而没有给出具有完整功能的程序模块。
有兴趣的读者可以对本程序的部分或全部进行修改、增加和精简,以便完善该程序的功能。
11.2.1程序功能简介
一个优秀的应用程序,必须有一个令人赏心悦目的用户界面。
一个设计良好的用户界面不但能够使用户得到视觉上的享受,而且能够提高人机交互的效率。
本程序的最主要部分是生成一个用户界面,其中包括创建一个全用户化的菜单、定制符合用户要求的按钮盒和对话框,并且在必要时能及时打开一个合适的窗口(如地图窗口、浏览窗口或统计窗口等)。
1。
用户菜单
一般情况下,我们并不需要完全放弃MapInfo的原始菜单,而只要在该菜单系统的基础上,适当地删去一些不需要的菜单或菜单项,再增加一些新的菜单或菜单项就可以制作出符合自己要求的菜单。
但MapBasic同样支持你创建一个全新的菜单系统,本程序就是采用了这种方式。
当运行该演示程序时,屏幕上将出现如图11.1所示的用户界面。
程序
图11-1演示程序的显示情况
除了显示一个用户菜单及用户按钮盒外,还打开了一个地图窗口,在地图窗口中打开了几个MapInfo表。
其中菜单栏在屏幕的最上方,它包括:
系统菜单、演示菜单、对象、旅游查询、旅游统计图及帮助。
·系统菜申.它由“打开表”、“关闭表”、“全部关闭”、“世界地图”和“退出”五个菜单项组成。
主要完成对MapInfo表的打开与关闭操作,并同时将它显示在一个地图窗口中。
其中“打开”是让用户选择并打开一个表,而“世界地图”是直接由MapBasic打开一个事先选定的表(World.tab);“关闭”是让用户选择一个当前打开的表把它关闭,并保存相应工作空间,而“全部关闭”是将当前矽甫打开的表全部关闭;“退出”是退出该演示程序恢复到原来的MapInfo界面。
.演示菜单它包含一个“建介”了菜单。
该子菜单用于生成一个用户菜单、按钮盒或对话柜。
对应于此英申的MapBaslc功能模块就是生成用户界面的最典型方法。
菜单项“工具栏”实质上是一个对话框,只是该对话框只包含四个复选框:
主、常用、绘图、用户。
当选中了其中的一个或多个,相应的按钮盒就会在屏幕亡显示,否则就会隐藏按钮盒。
这里按钮盒“主”、“常用”和“绘图”是MapInfo系统自带的,而“用户”按钮盒则是由本演示程序自制的。
另外,你还会看到三个呈现灰色的菜单项“设置更新口令”、“数据备份”和“数据恢复”,由于这些功能在本程序中还没有全部制作进去,所以这里把这些菜单项设置为不可选。
·对象MapBasic可以创建、修改对象,而且可以把一个对象赋给一个表的对象列。
该菜单包括一个“创建对象”子菜单和两个菜单项“折线转换成区域”、“区域转换成折线”。
其中两个菜单项是呈灰色的,表示它们不可选择。
而“创建对象”子菜单是用于创建MapInfo的图形对象,当用户选择了该子菜单下的一个菜单项时,程序首先将建立一个MapInfo表,并将该表地图化,接着为它追加一条记录,并把创建的对象赋值给该记录的对象列。
最后,程序将在一个地图窗口的一个可编辑图居中显示该对象。
·旅游查询该菜申的所有菜单项都是不可选的。
用户可以根据自己的要求编写相应的程序以完成该项功能。
.旅游统计图这个菜单的功能是将某些MapInfo表中的信息以统计图的形式显示在屏幕上,使得观察更加直观方便,当然你可以通过设置来指定统计图的格式。
.帮助该菜单提供了MapInfo主要功能的在线查询,通过Intemet访问MapInfo站点,以及有关本演水程序的一些信息。
2.按钮盒
按钮盒是用户界面的重要组成部分。
它以工具箱的形式为用户提供某些常用的功能。
MgpBasic中的按钮盒中的按钮有三种类型:
工具按钮、触发式按钮和按压式按钮(或称开关式按钮)。
一般地,当选中一个工具按钮时,应用程序并不立即调用相应的处理程序,而只是作好了一些必要的设置(如改变光标的形状),只有在选中该按钮后,继续在相应的窗口中进行单击或拖拉时应用程序才调用相应处理程序,如MapInfo“绘图”按钮盒中的“画线”、“画椭圆”等按钮就属此类。
触发式按钮是在选中该按钮时就立即调用处理程序,而按压式按钮是在“按压”或“恢复”该按钮时都调用处理程序。
用户可以根据各自的需要选择合适的按钮类型。
本演示程序有两处涉及按钮盒的创建,一个是在程序开始运行时就出现在屏幕上的“用户”按钮盒。
这里选择了一些对地图窗口进行操作的常用工具,如放大、缩小视图等。
该按钮盒是漂浮在整个桌面上的。
另外一个按钮盒是通过选择[演示菜单1>[建立]>[按钮盒]来创建的,该按钮盒是固定在窗口顶部,其中包含三个按钮,它们分别属于三种不同的类型。
3.对话框
该程序创建的一个最典型的对话框是通过选择[演示菜申—1>[建立3>[对话框]建立的。
它包括以下对话框控件:
StaticText、EditText、GroupBox、PopupMenu、ListBox、RadioGroup、SymbolPicker、CheckBox、OkButton和CancelButton。
另外,“系统菜单”中的“退出”菜单项、“演示菜单”中的“工具栏”菜单项、“帮助”菜单中的“关于”菜单项都是对话框的例子。
4.窗口
窗口也是用户界面的重要组成部分,Maplnfo包括多种类型的窗口,如地图窗口、浏览窗口、统汁窗口、布局窗口以及普通的信息窗口等。
本演示程序一执行就先打开一个地图窗口,并将窗口标题设置为“一个用户界面程序的演示示例”,另外,还可以用[系统菜单]>[打开]或[系统菜单]>[世界地图]打开一个地图窗口。
通过选择[旅游统计图]>[旅游人口]可以打开一个统计图窗口。
至于其他类型的统计图,本程序没有涉及,用户可以技类似的方法自己建立。
11.2.2源程序及其注解
1.源程序清单
‘一个用户界面演示程序:
Ye_Demo.mb
‘制作日期:
1998.7
‘目的:
快速掌握MapBasic程序开发.
‘内容:
生成用户界面的MapBasic程序
‘主要语句:
‘CreateMenu菜单名as生成菜单
‘子菜单名calling进程
‘CreateButtonPad按钮盒名As生成按钮盒
‘按钮类型[PushButton、ToolButton、Togg1eButton]
‘Dialog生成对话框
‘Title对话框标题
‘控制类型
‘***********标准定义文件***********
Include“mapbasic.def”
Include“icons.def”
Include“menu.def”
‘**********进程声明**********
DeclareSubMain
DeclareSubYe_denm
DeclareSubYe_ButtonPad
DeclareSubYe_Menu
DeclareSubYe_Tool
DeclareSubYe_graph
DeclareSubYe_Dialog
DeclareSubMenu_Test
DeclareSubButton_Test
DeclareSubYe_about
DeclareSubYe_Exit
DeclareSubYe_Button1
DeclareSubYe_Buttonn2
DeclareSubClose_all
DeclareSubClose_some
DeclareSubOpen_File
DeclareSubOpen_world
DeclareSubMake_ellipse
‘*************************
‘建立主菜单
‘*************************
SUBMain
0nerrorgotosub_err
CreateMenu“风景点”As
“按地区分”CallingYe_demo,
“按类型分”CallingYe_demo,
“按最佳旅游季节分”CallingYe_demo,
“(-“,
“风景点向导”CallingYe_demo
CREATEMENU“建立”As
“用户菜单“CallingYe_menu
“按钮盒\tCtrl+B/W^B/Mb/XCtrl+b”CallingYe_Buttonpad
“对话框\tCtrl+D/W^D/Md/XCtrl+d”CallingYe_Dialog
CreateMenu“创建对象”As
“点”CallingYe_demo,
“直线”CallingYe_demo,
“椭圆”CallingMmake_ellipse,
“折线”CallingYe_demo,
“矩形”CallingYe_demo,
“圆角矩形”CallingYe_demo,
“圆弧”CallingYe_demo,
“区域”CallingYe_demo,
“文本”CallingYe_demo,
“标签”CallingM_TOOLS_LABELER
CreateMENU“演示菜单”As‘****建立用户主菜单****
“建立”As“建立”,
“工具栏...”CallingYe_Tool,
“(-“,
“设置更新口令”CallingYe_demo,
“(-“,
“数据备份”CallingYe_demo,
“数据恢复”CallingYe_demo
CreateMenu“系统菜单”As
“打开表”ID111CallingOpen_File,
“关闭表”CallingClose_some,
“全部关闭”CallingClose_all,
“(-“,
“世界地图”IDll2CallingOpen_world,
“(-“,
“退出”CallingYe_exit
CreateMenu“旅游查询”As
“风景点”As“风景点”,
“风土人情”CallingYe_demo,
“路线”CallingYe_demo
CreateMenu“旅游统计图”As
“旅游收入”CallingYe_graph,
“旅游人数”CallingYe_demo,
“旅游淡旺季”CallingYe_demo
CreateMenu“帮助”As
“主题索引”CallingM_HELP_CONTENTS,
“Web页搜索”CallingM_HELP_CONNECT_MIFORUM,
“(-“,
“关于”CallingYe_about
CreateMenu“对象”As
“创建对象”As“创建对象”,
“(-“,
“折线转换成区域”CaingYe_demo,
“区域转换成折线”CallingYe_demo
AlterMenuItemYe_demoDisable
CreateMenuBarAs
“系统菜单”,”演示菜单”,”对象”,”旅游查询”,”旅游统计图”,”帮助”
‘’’****将所建立的用户菜单加入菜单栏*******
AlterBUTTONPAD“绘图”Hide‘**将不使用的按钮盒隐藏**
AlterBUTTONPAD“ODBC”HIDE
ALTERBUITONPAD“主”HIDE
ALTERBUTTONPAD“常用”HIDE
MENUBARSHOW‘****显示新菜单栏****
OpenTable“景点分布”As景点分布Interactive
OpenTable“省”As省Interactive
OpenTable“市”As市Interactive
MapFrom景点分布,市,省
Position(0.0520833,0.0520833)Units“in”
Width4.125Units“in”Height2.36458Units“in”
SetWindowFrontWindow()MaxScrollBarsOffAutoscrollOn
SetMap
CoordSysEarthProjection1,0
Center(119.6263825,29,3124845)
Zoom86.15402206Units“mi”
PreserveZoomDisplayZoom
XYUnits“degree”DistanceUnits“mi”AreaUnits“sqmi”
SetMap
Layer1
DisplayGraphic
LabelLineArrowPositionRightFont(“Arial”,0,12,0)Pen(1,2,0)
Withname
ParallelOnAutoOffOverlapOffDuplicatesOnOffset2
VisibilityOn
Layer2
DisplayGraphic
LabelLineArrowPositionRightFont(“Arial”,0,12,0)Pen(1,2,0)
With市
ParallelOnAutoOffOverlapOffDuplicatesOnOffset2
VisibilityOn
Layer3
DisplayGraphic
LabelLineArrowPositionRightFont(“Arial”,0,12,0)Pen(1,2,0)
With省
ParallelOnAutoOffOverlapOffDuplicatesOnOffset2
VisibilityOn
CreateButtonPad“用户”As
ToolButton
IconMI_ICON_ARROW
CallingM_TOOLS_SELECTOR
HelpMsg“Selectobjectsforediting\n选择”
ToolButton
IconMI_ICON_ZOOM_IN
CallingM_TOOLS_EXPAND
HelpMsg“工具按钮\n放大”
ToolButton
IconMI_ICON_ZOOM_OUT
CallingM_TOOLS_SHRINK
HelpMsg“工具按钮\n缩小”
ToolButton
IconMI_ICON_ZOOM_QUESTION
HelpMsg“工具按钮\n问题”
ToolButton
IconMI_ICON_GRABBER
CallingM_TOOLS_RECENTER
HelpMsg“工具按钮\n平移”
ToolButton
IconMI_ICON_INFO
CallingM_TOOLS_PNT_QUERY
HelpMsg“工具按钮\n信息”
PushButton
IconMI_ICON_MISC_15
CallingYe_Button1
HelpMeg“用户开关按钮\n按压式”
ToggleButton
IconMI_ICON_MAPSYMB_20
CallingYe_Button2
HelpMsg“用户触发式按钮\n触发式”
Show
SetwindowFrontWindow()title“一个用户界面程序的演示示例”
ExitSub
Sub_err:
NoteError$()
ExitSub
EndSub
‘’****************
‘’建立菜单
‘’****************
SUBYe_Menu
Onerrorgotosub_err
Createmenu“新菜单”as
“菜单项一”id3000CallingMenu_Test,
“删除菜单”id3001CallingMenu_Test
altermenubaradd“新菜单”
menubarshows
exitsub
sub_err:
noteError$()
exitsub
EndSub
‘’***************
‘’菜单调试
‘’**************
SUBMenuTest
DoCaselnt(CommandInfo(CMD_INFO_MENUITEM))
Case3000
Nots“您已经选用了菜单项一”
Case3001
Note“新菜单将被删除”
Altermenubarremove“新菜单”
EndCase
Menubarshow
EndSub
‘’**********************
‘’建立按钮盒
‘’**********************
SUBYe_buttonPad
CreateBUTTONNPAD“用户按钮”As
ToolButton‘’具按钮
IconMI_ICON_ARROW‘图标
CursorMI_CURSOR_CROSSSHAIR‘光标
CallingButton_Test‘调用进程
Id1001‘ID号
HelpMsg“工具按钮\n工具按钮”‘帮助信息
PUSHBUTTON‘佃发式按钮
ICONMI_ICON_HELP
CallingButton_Test
HelpMsg“触发式按钮\n触发式按钮”
Id1002
ToggleButton
IconMI_ICON_MAPSYMB_16
CallingButton_Test
ID1003
HelpMsg“开关式按钮\n开关式按钮”
SHOW
FIXED
EndSub
‘’*************
‘’按钮盒测试
‘’*************
SUBButton_Test
Onerrorgotosub_err
DOCaseInt(CommandInfo(CMD_INFO_TOOLBTN))
Case1001
Ifnumwindows()=OThen
NOTE“工具型技钮盒”+CHR$(10)+”请在地图窗口中使用”
Exitsub
ElseIfWindowInfo(FrontWindow(),WIN_INFO_TYPE)<>WIN_MAPPERThen
NOTE“工具型按钮盒”+CHR$(10)+”请在地图窗口中使用”
exitsub
else
note“当前光标位置”+CHR$(10)+”x:
”+str$(CommandInfo(CMD_INFO_X))+”y:
”+str$(CommandInfo(CMD_INFO_Y))
EndIf
Case1002
Note“触发型按钮盒”
Case1003
Note“按压型按钮盒”
EndCase
Exitsub
Sub_err:
NoteError$()
Exitsub
EndSub
SubYe_Button1
Note“按压型按钮盒”
EndSub
SubYe_Button2
Note“触发型按钮盒”
EndSub
‘’**********
‘’建立对话框
‘’**********
SUBYe_dialog
DimfilenameasString
Dimcntrl_valasInteger
Dialog
Title“一个用户界面演示程序”
ControlStaticText
Title“面板文本”
Position20,5
ControlPopupMenu
Title“下拉式菜单选项—1选项—2:
”
Position90,5
ControlGroupBox
Title“群组选择框”
Position10,20
Width80Height40
ControlRadioGroup
Title“&R单选一;&R单选二”
Position20,32
Valuel
Intocntrl_val
ControlListBox
Title“列表选择框;选项—1;选项—2;选项—3选项—4;选项—5;选项—6”
Width80height40
Positionl05,25
ControlStaticText
Title“线型:
”
Position20,70
ControlPenPicker
Position60,70
Width20Height20
ControlGroupBox
Title“编辑文本将存于:
”
Position10,100
Width160Height40
ControlEditText
Value“文件名”
Int