PB菜单和MDI.docx
《PB菜单和MDI.docx》由会员分享,可在线阅读,更多相关《PB菜单和MDI.docx(11页珍藏版)》请在冰豆网上搜索。
![PB菜单和MDI.docx](https://file1.bdocx.com/fileroot1/2022-11/23/70ce0d26-b930-4127-a7df-a48851cd9512/70ce0d26-b930-4127-a7df-a48851cd95121.gif)
PB菜单和MDI
[PB]-菜单和MDI
菜单条-MenuBar、菜单项-MenuItem、级联菜单(子菜单)-SubMenu
菜单项(MenuItem)是菜单中最基本的元素,只要有文字内容的就是菜单项。
菜单条(MenuBar)是菜单中级别最高的菜单项的总称,也叫做菜单标题。
菜单条的内容总是显示出来,对菜单的操作也是首先从这里开始的。
在菜单条上移动鼠标或者点击其中的项目可以显示对应的内容,称为下拉菜单,包括很多的菜单项,它们大多数都执行相应的功能,少数还可以包含更细致的内容,称为级联菜单(SubMenu),也叫做子菜单。
这样的菜单项右面都有小箭头指示
在设置菜单时,在设计窗口中的每一步修改都能反映到预览窗口中,随时可以检查级别关系是否正确。
如果发生顺序或者级别错误,可以用鼠标选中错误菜单项(不要使菜单项处于编辑状态),然后直接拖动到正确的位置即可。
在菜单项中输入内容时,有两个字符具有特殊的含义,“-”可以创建菜单项之间的分隔线,“...”表示该菜单项可以弹出一个属性对话窗口。
另外,弹出式菜单弹出的是某个下拉菜单或者某个级联菜单,也可以单独设计弹出式菜单,和下拉式菜单的设计没有什么区别。
【属性】
▲Name
在该属性框中为菜单项命名。
缺省菜单的名称都是m_加上菜单项的内容。
在脚本中引用菜单项时要从最开始一级加圆点符号逐级引用,比如要引用“文件”下的菜单项“打开”,可以使用“m_文件.m_打开”来引用。
▲Text
该属性就是在创建菜单时每个菜单项中输入的内容。
运行时的整个菜单内容就是该属性的内容。
▲MicroHelp
如果菜单挂接在MDIHelp!
类型的窗口中,运行状态下,当鼠标指针指向菜单项或者工具条中的小图标时,该文字可以显示在MDI窗口底部的状态条中
▲ToolbarItemText
可以定义显示在工具条小图标中的文字,以对小图标的功能有简短的描述。
当鼠标指针指向工具条中的小图标时,显示此文字
▲ToolbarItemName
该属性用来定义工具条小图标上显示的图形。
可以使用PowerBuilder提供的很多小图标,也可以自定义。
▲ToolbarItemDownName
菜单选中时,即checked时,按下的图标,一般与ToolBarItemName相同
▲ToolbarItemVisible
显示或隐藏工具条图标
▲ToolbarItemDown
菜单选中,即checked,图标按下
▲ToolbarItemSpace
指定该图标和前面图标之间的间距。
一般都是0,只有不同组的图标之间才有必要设置间距。
▲ToolbarItemBarIndex
指定图标显示在哪一行的工具条上。
该属性相同的图标显示在同一行,只要相同就可以,并不要求该属性取值为连续的数字。
▲ToolbarItemOrder
指定图标显示顺序,此值越大越靠后,默认0时按照菜单中的顺序显示。
如在菜单file下后exit,需要把exit图标放在最后,则其他都为0,exit设为1就可以了
▲ShortCutKey
该属性和ShortCutAlt,ShortCutControl和ShortCutShIft三个选项配合使用来定义菜单项的快捷键。
其他的属性使用得比较少。
〖菜单编程〗
●为“退出”菜单项编写脚本
在菜单中指代词parentwindow是指菜单挂接的窗口,比直接使用窗口的名称有更好的通用性。
所以在“退出”菜单项的Clicked事件中可以这样编写脚本:
close(parentwindow)
●选中某个菜单项
可以使用Checked标记来表示某个菜单项选中,可以在菜单项的Clicked事件中编写如下脚本来选中菜单项:
ifthis.checkedthen
this.checked=false
else
this.checked=true
endif
也可以使用函数Check和UnCheck来代替属性修改。
上面的脚本可以改成:
ifthis.checkedthen
this.uncheck()
else
this.check()
endif
当菜单项选中时,菜单项的左侧有一个“√”符号,并且对应的小图标为按下状态。
●隐藏某个菜单项
要隐含某个菜单项,可以将该菜单项的Visible属性修改为False,如果该菜单项位于菜单条的最高级别上,则可以将整个下拉菜单隐含。
例如,某窗口上挂接了菜单m_main,在窗口的打开事件中将菜单中的“文件”整个下拉菜单隐含,可以在该窗口的0pen事件中编写如下脚本:
m_main.m_文件.Visible=False
但是,将菜单项隐含并不能将其对应的在工具条中的小图标隐含,并且小图标的功能照样能够正常执行。
要将小图标隐含,应该设置ToolBarItemVisible属性为False。
例如,隐含菜单项“打开”对应的小图标,在窗口的打开事件中可以使用下面的语句:
m_main.m_文件.m_打开.ToolBarItemVisible=False
●使某个菜单项失效
将菜单项的Enabled属性置为False,即可使菜单项显示变灰而不能使用,同时对应的小图标也变灰。
如果足下拉菜单则整个下拉菜单不能使用,但其下拉项目对应的小图标可以正常使用。
如果是级联菜单则级联菜单不能被打开,但是级联菜单下的各个菜单项对应的小图标可以正常使用。
下面是在窗口打开事件中将菜单m_main的“文件”下的m_open修改为无效的脚本:
m_main.m_文件.m_open.Enabled=False
●调整工具条的位置
如果工具条的ToolBarUserControl属性(在application中)设置为True,则用户可以在工具条上按鼠标右键弹出菜单。
使用该弹出菜单可以调整工具条的显示位置。
用直接拖拉的方式也可以改变工具条的显示位置。
当工具条的位置发生变化时将触发窗口的ToolBarMoved事件,在该事件中可以编写脚本来判断工具条的移动情况。
当该事件触发时,PB自动修改Message中的参数WordParm和LongParm使用这两个属性可以判断工具条的移动情况,属性含义如下:
Message.LongParm属性的含义:
0:
移动到左侧;
1:
移动到顶部;
2:
移动到右侧:
3:
移动到底测;
4:
变为浮动显示。
Message.WordParm属性的含义:
O:
FrameBar在移动;
1:
SheetBar在移动。
关于工具条位置的编程一般是在窗口打开和关闭时应用。
关闭对应该保存用户关于工具条的设置,以便在窗口打开时将工具条恢复到上次关闭时的状态。
这些信息可以保存在应用的ini文件中,具体含义只要开发人员清楚即可,打开时按同样的含义来设置工具条的位置。
如在Frame的close()事件中编程(ToolbarAlignment为窗口的属性):
choosecasethis.ToolbarAlignment
caseAlignAtTop!
SetProfileString("C:
\toolbar.ini","setup","align","1")
caseAlignAtLeft!
SetProfileString("C:
\toolbar.ini","setup","align","0")
caseAlignAtRight!
SetProfileString("C:
\toolbar.ini","setup","align","2")
caseAlignAtBottom!
SetProfileString("C:
\toolbar.ini","setup","align","3")
caseFloating!
SetProfileString("C:
\toolbar.ini","setup","align","4")
endchoose
同样,在Frame的打开事件中可以根据ini文件的设置来决定工具条的显示。
例如,下面的脚本在打开事件中读取ini文件中的配置来决定工具条的显示位置:
stringls_align
ls_align=ProfileString("c:
\toolbar.ini","setup","align","1")
choosecasels_align
case'0'
this.ToolbarAlignment=AlignAtLeft!
case'1'
this.ToolbarAlignment=AlignAtTop!
case'2'
this.ToolbarAlignment=AlignAtRight!
case'3'
this.ToolbarAlignment=AlignAtBottom!
case'4'
this.ToolbarAlignment=Floating!
endchoose
当然,也可以用同样的方法保存更多的设置,例如是否隐含工具条,是否显示文字SheetBar的显示情况等等。
●修改工具条上右键弹出菜单中的内容
应用对象的属性ToolBarUserControl控制着用户是否可以在工具条上使用右键弹出菜单,该属性缺省是True,默认为英文格式,可以修改ToolBarFrameTitle、ToolabarSheetTitle、ToolbarPopMenuText等属性换成中文字。
ToolBarFrameTitle:
框架(也可理解为主菜单工具条)Frambar中文
ToolabarSheetTitle:
打开sheet后的Sheetbar中文
也可以在Frame的打开事件中编写脚本实现:
GetApplication().ToolbarPopMenuText="左侧、顶部、右侧、底部、浮动、文字、提示信息"
文字以逗号分隔,如果多了则被自动忽略。
只能修改该弹出菜单中的文字,但不能修改对应各项的功能。
其中函数GetApplication可以获取当前应用的句柄(handle)。
也可以在Frame的打开事件中使用下面的语句来限制用户不准使用工具条上的弹出菜单:
GetApplication().ToolbarUserControl=false
●动态设置MicroHelp
使用函数SetMicroHelp可以动态改变菜单项的MicroHelp内容。
该函数的语法是:
windowname.SetMicroHelp(string)
其中windowname是菜单所挂接的窗口名称,string是要设置的MicroHelp内容。
函数正确执行返回1,否则返回-1,如果有参数为null则返回null。
一般在菜单项的Selected事件中使用该函数。
如果在定制Frame窗口的控件中修改MicroHelp,还得在相关事件中取消MicroHelp。
一般在控件的GetFocus事件中显示MicroHelp提供关于该控件的解释信息,在LoseFocus事件中将MicroHelp修改为“Ready”。
一个保存MicroHelp的好方法是使用控件的Tag属性,在窗口画板中给每个要显示MicroHelp的控件的Tag属性都指定适当的内容,然后在需要改变MicroHelp的脚本中将Tag属性作为函数SetMicroHelp的参数即可。
●使用右键弹出菜单
在RButtonDown事件下使用函数PopMenu来显示弹出试菜单。
该函数的语法是:
menuname.PopMenu(xlocation,ylocation)
其中menuname是要弹出的菜单的名称,可以是某个下拉菜单中的某个下拉项目或者某个级联菜单。
xlocation和ylocation是菜单显示的位置,该坐标的取值是相对于窗口而言的。
通常使用函数PointerX和PointerY来获取该坐标,以便在鼠标点击的位置弹出菜单。
这两个函数的语法格式相同,PointerX的格式是:
objectname.PointerX()
其中objectname是控件名称,X是鼠标点击位置和objectname左边框的距离,缺省为脚本所在的控件。
在和函数PopMenu搭配使用时应该获取相对于窗口而言的坐标位置。
虽然每个控件的RbuttonDown事件中都有xpos和ypos参数可用,但这都是相对于控件而言的。
也就是说除了要弹出的菜单在窗口上,一般很少用xpos和ypos。
一般为menuname.PopMenu(parent.pointerX(),parent.pointerY())。
*Menu4NewMenu
NewMenu=CREATEMenu4
NewMenu.m_language.PopMenu(PointerX(),PointerY())
NewMenu.m_language.PopMenu(w_frame.PointerX(),w_frame.PointerY())
●改变窗口中的菜单
函数ChangeMenu可以动态改变窗口的菜单。
它的语法格式是:
windowname.ChangeMenu(menuname{,position})
其中,windowname是要改变菜单的窗口的名称;menuname是要挂接到窗口上的菜单的名称;position是可选参数,仅用于MDIFrame窗口中,用来指示给当前的窗口列表中追加的菜单标题的位置。
缺省值为1,这时所有打开的Sheet出现在第一个菜单标题的下拉式菜单的底部。
●
隐藏和显示工具栏
windowname.ToolbarVisible=True/False
隐藏和显示文字
GetApplication().ToolbarText=True/False
隐藏和显示提示信息
GetApplication().ToolbarTips=True/False
〖MDI〗-MultipleDocumentInterface
*菜单是MDI应用中必不可少的,不仅Frame必须有一个菜单,就连在客户区打开的各个Sheet也应该有菜单,如果没有就会自动继承前面Sheet的菜单。
有两种通常的方式来为MDI的Sheet表提供菜单:
在框架和每个Sheet之间共享一个菜单,或者分别为每个Sheet提供一个单独的菜单,当然也可以这两种方式混合使用。
当打开多个有菜单的Sheet时,只有当前Sheet的菜单显示在Frame顶部,其他Sheet的工具条可以显示,而它们的菜单不显示。
菜单提供各个Sheet间切换的功能,以及在Sheet中能够完成的绝大部分功能。
每个菜单可以有自己对应的工具条,也可以没有,还可以对应多行工具条,这些都是在菜单画板中设计的。
*客户区是MDI窗口中用户的工作区间,Sheet都是在该区域显示的,它们的显示范围不会超过该区域。
如果在MDI框架中放置了控件,这样的MDI窗口称为定制Frame,否则就称为标准Frame。
客户区实际上是一个非常特殊的控体该控件叫做mdi_1,只有当运行时才可用。
当使用定制Frame时mdi_1控件不能正确显示在可视区域,这时打开Sheet也不会正常显示,应该在Frame的Resize事件中编写脚本,对mdi_1重新进行定位。
假设在Frame的上部放置了命令按键cb_1,在命令按键的下面和状态条之间显示mdi_1。
脚本如下:
uintli_x,li_y,li_width,li_height
li_x=WorkSpaceX()
li_y=cb_1.y+cb_1.Height
li_width=WorkSpaceWidth()
li_height=WorkSpaceHeight()-li_y-mdi_1.MicroHelpHeight
mdi_1.Move(li_x,li_y)
mdi_1.Resize(li_width,li_height)
上述脚本中的函数WorkSpaceX、WorkSpaceWidth、WorkSpaceHeight和另外的函数WorkSpaceY用来获取关于工作区域的参数,使用方法都比较简单,只要注意这些函数都不包括工具条所占用的区域。
通过上述脚本,mdi_1控件就可以正确显示在Frame的可视范围内,再打开Sheet也不会出现什么异常了。
当使用标准Frame时,系统会自动维护客户区的位置和大小。
*在MDI应用系统中,Frame窗口必须包含一个菜单,该菜单可以有工具条也可以没有。
在Frame菜单中可以编写打开Sheet的脚本。
Sheet并非特殊类型的窗口,只是在Frame中打开就称为了Sheet,实际上就是非MDI类型的窗口。
虽然Sheet就是普通的窗口,但不能使用Open函数打开,要使用OpenSheet或者OpenSheetWithParm函数来打开。
Sheet可以有菜单也可以没有菜单。
当打开带有菜单的Sheet时,Sheet的菜单自动取代Frame的菜单;当打开没有菜单的Sheet时,该Sheet自动使用Frame的菜单(当然,可能是Frame本身自带的菜单,也有可能是其他Sheet的菜单)。
这时就出现了问题,当打开带菜单的Sheet时,Sheet的菜单覆盖了Frame的菜单,Frame菜单中的功能如何执行?
好的解决方法就是使用工具条。
Sheet的菜单替换了Frame的菜单后,Frame的工具条始终可以显示,使用工具条照样可以正常执行Frame菜单的功能。
所以,在创建Frame的菜单时,好的习惯就是要同时创建菜单的工具条。
但是,使用这种解决方法时,工具条中小图标功能的易记易用性就非常重要了,开发人员应该尽可能提供更多关于小图标的信息,如MicroHelp,Tips和ToolBarItemText等。
另外一种解决方法可能有一定的适用情况,就是让所有的Sheet都共享Frame的菜单,当所有的Sheet都进行同一类型或相似类型的操作时,比如像微软的Word似的,Sheet都进行文件编辑的情况下,这种方法就比较实用,菜单的维护就比较简单。
【函数】
★opensheet和opensheetwithparm
在Frame菜单中可以编写打开sheet的脚本。
sheet并非特殊类型的窗口,只是在Frame中打开就称为了sheet,实际上就是非MDI类型的窗口,虽然Sheet就是普通的窗口,但不能使用open函数打开,要使用OpenSheet或者OpenSheetWithParm函数来打开。
其中OpenSheet函数不给Sheet传递参数,而函数OpenSheetWithParm可以在打开Sheet的同时传递参数。
OpenSheet的语法格式是;
OpenSheet(Sheetrefvar{,windowtype},mdiframe,{,position{,arrangeopen}})
其中,Sheetrefvar是要打开的Sheet的名称(注意,不能是MDl类型的窗口);mdiframe是Frame的名称,表示要在这个Frame的客户区打开名称为sheetrefvar的Sheet;这两个参数指明了在哪个Frame中打开哪个Sheet,都是必须的。
变量windowtype为string类型,用来表示要打开的窗口的名称,如果指明该参数,则sheetrefvar的类型必须是能够接受window类型的赋值,这时的函数表示要打开windowtype名称的窗口,并将其实例保存在变量sheetrefvar中,可以使用该变量引用这个sheet。
position是一个integer类型的参数,表示在菜单条中的位置,新打开的sheet名称作为一个菜单项添加在该位置的下拉菜单中。
菜单条最左面的项目位置为1,依次增加,当该参数大于菜单条中的项目数时则将sheet名称添加到右侧倒数第二个菜单的下面。
如果打开的sheet数据超过9个,多余的则以级联菜单的形式显示在该菜单的morewindows下。
参数arrangeopen是指打开sheet后在客户区中的布局方式,是arrangeopen枚举类型的值,有3个可以使用的取值。
Cascaded!
:
将打开的sheet层叠起来,使所有的标题栏都可见。
这是缺省方式。
Layered!
:
将打开的sheet完全地覆盖在客户区,后打开的覆盖前面的sheet。
Original!
:
用窗口的原始尺寸打开,打开后并以Cascaded!
方式安排布局。
eg:
在名称为MDI_my的Frame中打开窗口名称为w_edit的窗口
opensheet(w_edit,MDI_my)
opensheet(w_edit,MDI_my,3,Cascaded!
)
windowlw_w
opensheet(lw_w,"w_edit",MDI_my,3,Cascaded!
)
和opensheet函数类似,opensheetwithparm函数中的很多参数含义完全相同。
其语法格式如下:
OpenSheetWithParm(Sheetrefvar,parameter{,windowtype},mdiframe{,position{,arrangeopen}})
其中parameter是要传递的参数,可以是String,Number或者PowerObject类型,该函数用法及参数含义和opensheet完全相同。
★GetActiveSheet
使用函数GetActiveSheet可以获取当前的Sheet,该函数的语法如下:
mdiframewindow.GetActiveSheet()
其中mdiframewindow是当前Frame的名称。
该函数返回window类型数值,是当前活动的sheet。
执行过程中发生错误则返回无效数据,如果mdiframewindow为null则返回null。
该函数经常和IsVaild配合使用,来检查函数返回的窗口是否有效。
IsValid,判断指定对象是否有效,该函数语法为:
IsValid(objectname)
其中objectname是要进行是否有效判断的对象。
该函数返回为boolean类型的值。
GetFirstSheet()
GetNextSheet()
★ArrangeSheets
使用函数ArrangeSheets可以安排当前打开的和最小化的Sheet的布局,该函数的语法是:
mdiframe.ArrangeSheets(arrangetype)
其中,mdiframe为Frame的名称,arrangetype是arrangetypes枚举类型的数值,可以取为:
Cascade!
:
将打开的Sheet层叠起来,使所有的标题栏都可见。
Layer!
:
将打开的Sheet完全的覆盖在客户区。
Tile!
:
将打开的Sheet以平铺的方式从左到右排列。
TileHorizontal!
:
将打开的Sheet并排放置。
Icons!
:
仅将最小化的Sheet沿Frame的底部放置。
该函数正确执行则返回1,否则返回-1,如果有参数为null则返回null。
★GetToolbar、GetToolbarPos和SetToolbar、SetToolbarPos
获取工具条的信息
可以使用属性和函数来获取关于工具条的信息。
下面是应用对象关于工具条的属性,这些属性经常和函数GetApplication一起使用。
这些属性既可以控制工具条的显示情况,也可以获取关于工具条的信息。
ToolbarFrameTitlestring浮动显示的工具条上的标题
ToolbarSheetTitlestring浮动显示的sheet工具条上的标题
ToolbarPopMenuTextstring工具条弹出菜单中的文字
ToolbarUserControlboolean工具条是否可以使用弹出菜单来控制
ToolbarTextboolean工具条中的小图标是