pb菜单和mdi_第1页
pb菜单和mdi_第2页
pb菜单和mdi_第3页
pb菜单和mdi_第4页
pb菜单和mdi_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 该属性和 ShortCut Alt,ShortCut Control 和 ShortCut ShIft 三个选项配合使 用来定义菜单项的快捷键。 其他的属性使用得比较少。 菜单编程 为“退出”菜单项编写脚本 在菜单中指代词 parentwindow 是指菜单挂接的窗口,比直接使用窗口的名称有 更好的通用性。所以在“退出”菜单项的 Clicked 事件中可以这样编写脚本: close(parentwindow) 选中某个菜单项 可以使用 Checked 标记来表示某个菜单项选中,可以在菜单项的 Clicked 事件 中编写如下脚本来选中菜单项: if this.checked then this.checked = false else this.checked = true end if 也可以使用函数 Check 和 UnCheck 来代替属性修改。上面的脚本可以改成: if this.checked then this.uncheck() else this.check() end if 当菜单项选中时,菜单项的左侧有一个“”符号,并且对应的小图标为按下 状态。 隐藏某个菜单项 要隐含某个菜单项,可以将该菜单项的 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 为窗口的属性): choose case this.ToolbarAlignment case AlignAtTop! SetProfileString(“C:toolbar.ini“,“setup“,“align“,“1“) case AlignAtLeft! SetProfileString(“C:toolbar.ini“,“setup“,“align“,“0“) case AlignAtRight! SetProfileString(“C:toolbar.ini“,“setup“,“align“,“2“) case AlignAtBottom! SetProfileString(“C:toolbar.ini“,“setup“,“align“,“3“) case Floating! SetProfileString(“C:toolbar.ini“,“setup“,“align“,“4“) end choose 同样,在 Frame 的打开事件中可以根据 ini 文件的设置来决定工具条的显示。 例如,下面的脚本在打开事件中读取 ini 文件中的配置来决定工具条的显示位 置: string ls_align ls_align = ProfileString(“c:toolbar.ini“,“setup“,“align“,“1“) choose case ls_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! end choose 当然,也可以用同样的方法保存更多的设置,例如是否隐含工具条,是否显示 文字 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()。 *Menu4 NewMenu NewMenu = CREATE Menu4 NewMenu.m_language.PopMenu(PointerX(), PointerY() NewMenu.m_language.PopMenu(w_frame.PointerX(), w_frame.PointerY() 改变窗口中的菜单 函数 ChangeMenu 可以动态改变窗口的菜单。它的语法格式是: windowname.ChangeMenu(menuname,position) 其中,windowname 是要改变菜单的窗口的名称;menuname 是要挂接到窗口上的 菜单的名称;position 是可选参数,仅用于 MDI Frame 窗口中,用来指示给当 前的窗口列表中追加的菜单标题的位置。缺省值为 1,这时所有打开的 Sheet 出现在第一个菜单标题的下拉式菜单的底部。 隐藏和显示工具栏 windowname.ToolbarVisible = True/False 隐藏和显示文字 GetApplication().ToolbarText = True/False 隐藏和显示提示信息 GetApplication().ToolbarTips = True/False MDI-Multiple Document Interface *菜单是 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。脚本如下: uint li_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 个,多余的则以级联菜单的形式显示在该菜单的 more windows 下。参数 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!) window lw_w opensheet(lw_w,“w_edit“,MDI_my,3,Cascaded!) 和 opensheet 函数类似,opensheetwithparm 函数中的很多参数含义完全相同。 其语法格式如下: OpenSheetWithParm(Sheetrefvar,parameter,windowtype,mdiframe,positi on,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 一起 使用。这些属性既可以控制工具条的显示情况,也可以获取关于工具条的信息。 ToolbarFrameTitle string 浮动显示的工具条上的标题 ToolbarSheetTitle string 浮动显示的 sheet 工具条上的标题 ToolbarPopMenuText string 工具条弹出菜单中的文字 ToolbarUserControl boolean 工具条是否可以使用弹出菜单来控制 ToolbarText boolean 工具条中的小图标是否显示文字 ToolbarTips boolean 工具条中小图标是否显示提示信息 函数获取工具条信息-GetToolbar、GetToolbarPos window.GetToolbar(Toolbarindex,visible,alignment,floatingtitle) 其中,window 为 Frame 的名称;Toolbarindex 是想要获取信息的工具条的索引 号,为整型数值;这两个参数在函数执行之前就应该有明确的取值,可以是常 量或相应类型的变量。其他参数必须为变量,在函数执行后保存关于工具条的 特定信息。参数 alignment 为 ToolbarAlignment 枚举类型的变量,用来保存工 具条的对齐方式,该参数为可选;参数 floatingtitle 为 string 类型的变量, 用来保存浮动工具条的标题。函数正确执行返回 1,否则返回-1,如果任何参 数为 null 则返回 null。 *保存和恢复工具条 gf_SaveToolBar(window fa_win) /保存工具条 Int li_row,li_Offset,li_x,li_y,li_width,li_height /保存工具条的位置 信息 Boolean lb_visible /工具条是否可见 Boolean lb_tips,lb_showtext /工具条是否有气泡提示、是否显示文字 ToolBarAlignment lta_align /工具条的对齐方式 String ls_title,ls_alignment,ls_section If fa_win.GetToolBar(1,lb_visible,lta_align,ls_title) 1 Then Return 1 ls_section = fa_win.ClassName() /读取窗口的名称 ls_visible = ProfileString(“test.ini“,ls_section,“visible“,“) /读取 工具条的 visible 属性 If ls_visible “ Then /正确读取了该属性 ls_alignment = ProfileString(“test.ini“,ls_section,“alignment“,“Top“) /读取对齐方式 ls_title = ProfileString(“test.ini“,ls_section,“title“,“) /读取工具 条标题 If Upper(ls_visible) = “TRUE“ Then lb_visible = True Else lb_visible = False End If Choose Case Lower(ls_alignment) /将字符型转换成 Alignment 类型 Case “left“ lta_align = AlignAtLeft! Case “right“ lta_align = AlignAtRight! Case “Top“ lta_align = AlignAtTop! Case “botTom“ lta_align = AlignAtBotTom! Case “floating“ lta_align = Floating! End Choose fa_win.SetToolBar(1,lb_visible,lta_align,ls_title) /设置 当前工具条的信息 li_row = Pr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论