350 likes | 552 Vues
第 3 章 窗口. 3.1 创建新的窗口对象 3.2 窗口属性 3.3 窗口函数 3.4 窗口事件 3.5 窗口编程 3.6 小结. 创建一个空白窗口:按下工具栏上“ New” 图标按钮,弹出 New 属性页对话框,选择 Object 页,双击 Windows 图标或选中 Windows 图标后单击 OK 按钮即可。窗口对象命名时的默认前缀为 w_ 。. 3.1.1 创建窗口对象的过程.
E N D
第3章 窗口 3.1 创建新的窗口对象 3.2窗口属性 3.3 窗口函数 3.4 窗口事件 3.5 窗口编程 3.6 小结
创建一个空白窗口:按下工具栏上“New”图标按钮,弹出 New属性页对话框,选择Object页,双击Windows图标或选中Windows图标后单击OK按钮即可。窗口对象命名时的默认前缀为w_。 3.1.1 创建窗口对象的过程
实现窗口继承的方法:点击继承按钮,选择对象类型(Object Type)为窗口(Windows),在窗口对象列表单中选择要继承的祖先窗口,双击左键选中或单击后按OK按钮确定。 窗口继承应用在以下几种情况,一种是需要创建若干个窗口,另一种是有一个或多个窗口,这两种情况,都比较适合于应用窗口的继承。 使用窗口的继承建立窗口对象时,祖先对象中的所有内容全部被它的后代继承。 在后代窗口中,可以引用祖先的函数、事件以及结构,改变窗口的属性以及窗口和控件的大小和位置,修改现有的控件以及添加新的控件,编写新的脚本,声明新的变量、函数、事件以及结构。 使用窗口的继承,需要注意以下二点: (1)后代窗口中所有继承来的控件,都不允许删除。遇到 不需要的祖先控件,可以采用将该控件的可视性属性(Visible)不选中,让其在后代窗口中不可见的方法使其消失。 (2)祖先和后代窗口中的控件名称必须唯一,不能使用相同的控件名称。 3.1.2 窗口的继承
3.1.3 窗口画板 窗口画板是由 布局视图区、 窗口属性区、 函数列表区、 脚本编辑区、 结构列表区、 结构定义区、 控件列表区、 事件列表区 以及非可视 对象列表区 等区域组成。
区域的打开可以在View菜单项下进行选择。 新窗口产生后,随后就需要对其属性进行设置,以满足不同应用的需要。 3.1.3 窗口画板
3.1.4 预览窗口 在窗口的设计过程中,可以随时预览设计窗口在实际运行时的外貌,方法是点击工具栏上的Preview图标,或点击菜单标题Design下的Preview菜单项,也可以直接使用快捷键Ctrl+Shift+P。
3.2 窗口属性 • 窗口的作用见表。其中最重要的是基本特征属性页。 3.2.1 窗口的类型和基本属性 窗口标题栏用于设置窗口标题;窗口标记栏用于输入窗口标识;窗口菜单名称用于配置窗口菜单,窗口本身没有菜单,通过选择菜单,可以方便地将所需要的菜单挂接到窗口上,在窗口与菜单的组合上具有很大的灵活性。窗口的背景颜色和MDI子窗口的颜色可以从下拉菜单中提供的背景颜色中选择。
3.2.1 窗口的类型和基本属性 窗口的 基本特征 属性页 见图。
3.2.1 窗口的类型和基本属性 • 窗口的基本特征属性页中有12个复选框,控制着12个布尔变量。
3.2.1 窗口的类型和基本属性 窗口的类型是 按照窗口具有不完全相同的外部和内部特征划分的。 窗口的类型有六种,缺省为主窗口类型。
3.2.1 窗口的类型和基本属性 • 说明: (1)模式化是指在关闭当前响应窗口之前,不能切换到应用程序的其它窗口。 (2)多文档窗口与带微帮助的多文档窗口特性基本一致,只是后者增加了MicroHelp功能,即在MDI框架底部的状态行中,可以显示帮助信息。
3.2.2 窗口的滚动属性 窗口的滚动属性页见图。
3.2.2 窗口的滚动属性 • 滚动属性页中两个复选框HscrollBar和VScrollBar决定窗口是否采用水平或垂直滚动条,其余四个带微调按钮的数字编辑框设置滚动速度。 • PowerBuidler使用自己的屏幕尺寸度量方法PBU,单位为units,PBU与屏幕像素之间通过系统提供的两个函数可以相互转换,UnitsToPixels(Units,type)实现PBU到屏幕像素的转换;PixelsToUnits (Pixels,type)实现屏幕像素到PBU的转换。
3.2.3 应用程序窗口的工具栏 注意:这里所说的工具栏并非在PowerBuilder编程环境中系统提供的 工具栏,而是指应用程序制作的、在应用程序中使用的工具栏。 工具栏放置位置有5种。
3.2.3 应用程序窗口的工具栏 应用程序窗口的工具栏属性页见图3-6。
3.2.4 窗口的其它属性页 窗口的其它属性页见图。
3.2.4 窗口的其它属性页 窗口的其它属性页包含了两个功能: • 一个是调整窗口的位置和几何尺寸; • 另一个是选择在窗口内的光标形状。 调整窗口的几何尺寸有两种方法: • 一种是在窗口画板的布局视图区中用鼠标来实现,将鼠标移动到布局视图区中窗口的外边沿处,使鼠标指针变为双向箭头,然后按下鼠标左键并拖动鼠标来改变窗口的大小。窗口尺寸改变较大时,需要借助布局视图区的水平或垂直滚动条来完成。 • 另一种调整窗口的几何尺寸的方法就是在本属性页中修改窗口的尺寸,所有尺寸均采用PBU 的单位units。
3.3.1 PowerBuidler窗口函数 几个常用窗口函数及其使用方法: 1. 窗口的操作 : • 打开窗口(无参数)Open(windowvar {,Parent}) windowvar:窗口变量名; parent:父窗口变量名 1:打开窗口成功;-1:出错 • 打开窗口(带参数) OpenWithParm ( windowvar, parameter {, parent } ) • 关闭窗口 Close(wndname) wndname:窗口变量名 1:成功 -1:出错 • 关闭窗口(带返回值) CloseWithReturn(Wndname,rtnval) wndname:窗口变量名; rtnval:要返回的值 1:成功 -1:出错 • 显示窗口 objectname.Show() objectname:窗口、控件或其它对象的名称1:成功 -1:出错
3.3.1 PowerBuidler窗口函数 • 显示窗口 objectname.Show() objectname:窗口、控件或其它对象的名称1:成功 -1:出错 • 隐藏窗口 objectname.Hide ( ) objectname:窗口、控件或其它对象的名称 1:成功 -1:出错 • 移动窗口objectname.Move ( x, y ) objectname:窗口、控件或其它对象的名称;(x,y):移动目标点位置PBU 1:成功-1:出错 • 改变窗口大小 objectname.Resize ( width, height ) objectname:窗口、控件或其它对象的名称; width:新的宽度 height:新的高度 1:成功 -1:出错 2.MDI窗口 • 打开表单窗口 OpenSheet ( sheetrefvar{, windowtype },mdiframe{, position {,arrangeopen }} ) Sheetrefvar:MDI窗口外的任何窗口类型的变量; windowtype:要打开窗口的类型; mdiframe: MDI框架窗口名称; position:要打开表单在菜单中的编号; arrangeopen:要打开表单出现的格式,取值Cascaded!,Layer!或Original! 1:成功 -1:出错
3.3.1 PowerBuidler窗口函数 • 返回当前活动表单窗口 mdiframewindow.GetActiveSheet ( )mdiframewindow: MDI框架窗口 成功返回window对象; 一般用IsValid ()函数判断返回窗口是否有效 • 返回第一个表单窗口 mdiframewindow.GetFirstSheet ( )mdiframewindow: MDI框架窗口 成功返回window对象;一般用IsValid ()函数判断返回窗口是否有效 • 返回下一个表单窗mdiframewindow.GetNextSheet ( sheet )mdiframewindow: MDI框架窗口 成功返回window对象;一般用IsValid ()函数判断返回窗口是否有效 • 状态行中显示字符串 windowname.SetMicroHelp ( string )Windowname:带微帮助的MDI框架窗口名称 String:要显示的字符串 1:成功 -1:出错
3.3.1 PowerBuidler窗口函数 3. 触发事件 • 触发事件 objectname.TriggerEvent ( event {, word, long } ) objectname:对象名称; event:要触发的事件; word和long:传递的事件参数 TRUE:成功 FALSE:失败 • 触发事件(放入事件队列) objectname.PostEvent ( event, { word, long } )objectname:对象名称; event:要触发的事件;word和long:传递的事件参数 TRUE:成功 FALSE:失败 传递参数的具体要求: (1)传递参数只能是字符串、数值或PowerBuilder对象; (2) 传递参数存储在Message对象的相应属性中,即在Message.StringParm中,数值在Message.DoubleParm中,PowerBuilder对象在Message.PowerObjectParm中; (3)要返回多个值,应创建存放传递参数的用户自定义结构,访问Message对象的PowerObjectParm属性。 (4)传递事件参数为word或long数据类型,传递参数存储在Message对象的相应属性中,即WordParm和LongParm中。如果Long参数值为字符串,可在被触发的事件中,使用String函数,并用address关键字指定参数的格式。
定义和使用用户自定义函数的步骤: 如果函数定义区没有打开,则可以用下列两种办法之一将其打开。 (1)单击Insert菜单标题下的Function菜单项; 3.3.2 用户自定义窗口函数
3.3.2 用户自定义窗口函数 (2)点击脚本子窗口左上边的下拉列表框的小三角,选择弹出列表选项中的Function项。
3.3.2 用户自定义窗口函数2. 函数定义区 弹出的函数定义区见图。
在Access中选择函数返回值的访问控制范围,在Return Value栏中选择返回值的数据类型。在Function Name 栏中输入函数的名称。定义函数的入口参数,在Value下拉列表框中选择入参的传递方式。在Argument Type下拉列表框中选择入参的数据类型,在Argument Name栏中输入入参的名称。 3.3.2 用户自定义窗口函数
3.3.2 用户自定义窗口函数 3. 函数的使用 函数的使用有静态调用和动态调用两种方式 • 前者是系统缺省的函数调用方式,静态调用,就是系统在编译代码时就对函数进行彻底地编译,对返回值以及入参进行检查和匹配,出现问题立即报告错误。例如,在窗口w_1中定义了一个整型数的加法运算函数 integer AddFunc(integer add1,integer add2)。则静态调用的方法为: int value=w_1.AddFunc(123,456) • 动态调用的函数在执行的时候才会去查找和调用相应的函数,在程序编译时可以没有该函数。优点是程序的开发具有极大的灵活性,缺点是降低了应用程序执行的速度,缺少调试编译中的错误检查功能。动态调用的方法是在函数名称前加上DYNAMIC。动态调用的方法示例: int value=w_1.DYNAMIC AddFunc(123,456)
3.4 窗口事件 程序设计的一个显著特点是客户程序和函数大都是由事件触发的,编程者需要在某一事件发生的时候进行相关的处理。 窗口的主要事件 : • Activate :在激活(Active)窗口前发生 该事件发生后, 窗口中第一个跳转次序号最小的对象首先得到焦点。如果窗口中没有这样的对象,则窗口本身得到焦点 • Clicked:参数Unsigned Long flags、Integer xpos 、Integer ypos 用户单击窗口中空白区域时发生。 flags指明用户按了鼠标的哪个键及按键时用户是否按住了Alt或Ctrl键; xpos指明单击时鼠标指针离窗口左边缘的距离; ypos指明单击时鼠标指针离窗口上边缘的距离Close无窗口被关闭时发生。触发该事件后,没有办法能够阻止窗口关闭操作 • CloseQuery :开始关闭窗口时,发生该事件,返回值为0或1。 执行该事件的事件处理程序后,检查返回值,返回值为1,窗口不被关闭,紧随其后发生的Close事件不被产生;返回值为0,窗口被关闭。用该事件程序能够根据当前状态提醒保存数据、询问是否真要关闭窗口。窗口被关闭时,关闭任何与之相关的子窗口和弹出窗口 • Deactivate:窗口变为不活动时发生 • DoubleClicked :参数:Unsigned Long flags , Integer xpos , Integer ypos 当双击窗口客户区中任何未被有效控件占用的部分时发生。各参数的意义与Clicked事件相同
3.4 窗口事件 • DragEnter:参数:DragObject source 当可拖放对象进入窗口客户区时发生。 参数source是个引用,指明被拖动的是哪个对象 • DragLeave:参数:DragObject source 当可拖放对象离开窗口客户区时发生。 参数source是个引用,指明被拖动的是哪个对象 • DragWithin :参数:DragObject source 当可拖放对象在窗口客户区中被拖动时发生。 参数source是个引用,指明被拖动的是哪个对象 • HotLinkAlarm:在动态数据交换(DDE)服务器应用发送了新的(修改后的)数据、且客户DDE应用程序已经接收到数据时发生 • Key :参数:key (枚举型键码) ULong keyflags 在键盘上按下一个键且插入点不在编辑区域中时发生。 参数key是个枚举型数据,指示按下了哪个键;参数keyflags指明按键时是否同时按住了Alt和/或Ctrl键 • MouseDown :参数: Unsigned Long flags, Integer xpos, Integer ypos 在窗口客户区中未被有效控件占用的部分按下左键时发生。各参数的意义与Clicked事件相同,flags的值总为1 • MouseMove :参数: Unsigned Long flags, Integer xpos ,Integer ypos当鼠标在窗口内移动时发生。 各参数的意义与Clicked事件相同 • MouseUp :参数: Unsigned Long flags ,Integer xpos ,Integer ypos当用户在窗口客户区中任何未被有效控件占用的部分放开鼠标左键时发生。各参数的意义与Clicked事件相同
3.4 窗口事件 • Open :在窗口打开之后、显示之前发生。 下述函数触发窗口的Open事件:Open、OpenWithParm、OpenSheet、OpenSheetWithParm • RButtonDown :参数 :Unsigned Long flags , Integer xpos , Integer ypos 当用户在窗口客户区中任何未被有效控件占用的部分按下鼠标右键时发生。各参数的意义与Clicked事件相同 • RemoteExec:一个DDE客户应用程序发送了一条命令时发生 • RemoteHotLinkStart:一个DDE客户应用程序要开始一个热连接时发生 • RemoteHotLinkStop:一个DDE客户应用程序要结束一个热连接时发生 • RemoteRequest:一个DDE客户应用程序请求数据时发生 • RemoteSend :一个DDE客户应用程序已经发送了数据时发生 • Resize:参数:ULong sizetype,Integer newwidth, Integer newheight 窗口大小发生变化、窗口被打开时产生此事件。 参数sizetype指明改变窗口大小的类型; newwidth指明窗口的新宽度; newheight指明窗口的新高度 • SystemKey :参数:key(枚举型键码)ULong keyflags 插入点不在编辑框中且用户按下Alt或Alt+其它键时发生。 各参数的含义与Key事件类似 • Timer :调用Timer函数启动定时器、设定时间后发生 • ToolbarMoved :MDI窗口上的工具栏被移动时发生
3.4 窗口事件 • 当第一次打开窗口时,在窗口显示之前系统触发Open(打开)事件,在Open事件发生时,系统已经创建了窗口及窗口中的控件. • 窗口被打开后,窗口类型(Window Type)属性不能再被更改 . 编写窗口的事件处理程序的步骤为: • 打开该窗口; • 如果脚本编辑区没有打开,可右键单击视图编辑区中设计的窗口(不要单击窗口上的任何控件,该步操作的目的是选中窗口,打开右键菜单),单击菜单中Script菜单项,即可打开脚本编辑区。 • 在“选择事件”列表框中选择要编程的事件,例如Open(),然后根据应用需要编写特定的程序。一般,窗口Open事件中,要安排窗口中控件和数据窗口的初始化程序,有关编程方法将在窗口控件中介绍。
3.5.1 在窗口中编写脚本 脚本采用PowerScript 语言编写,脚本中可以使用各种窗口函数、系统函数、自定义函数和API函数,可以直接对窗口对象的属性赋值,改变它们的外观或行为。可以测试属性的值,获取窗口对象的信息。 例如,在窗口的Key事件中,捕捉用户的按键,并根据按键的类型进行不同的处理。可以在窗口的Key事件脚本区中编写如下代码: // key为系统捕捉到的用户按键,keyenter!为“回车”键的枚举值 if key=keyenter! then cb_ok.triggerEvent(Clicked!) // 触发cb_ok控件的Clicked事件 end if 窗口的Open事件是对窗口以及窗口中控件进行初始化的地方,编写脚本的机会最多。
3.5.2 窗口设计实例 设计一个窗口应用程序,运行程序时打开主窗口,在主窗口中单击鼠标右键后,每隔10秒弹出一个消息对话框,再次单击右键则停止弹出消息对话框;在主窗口中单击鼠标左键就弹出一个响应式子窗口。 1. 建立工作空间和应用 2.建一个主窗口对象 • 建一个主窗口对象,设置窗口对象的General属性页中Title为“应用程序主窗口”, 窗口类型为main!. • 再创建一个响应式窗口,设置窗口对象的General属性页中Title为“响应鼠标左键窗口”,选择窗口类型为response!,在Other属性页中设置Position的X为100,Y为80,保存窗口名称为w_respwin。 3. 为主窗口对象编写脚本 • 在脚本区左上角的对象下拉列表框中选中(Declare),在中间的事件下拉列表框中选择Instance Variables,再在脚本区中输入如下的变量声明和对该变量进行初始化: boolean TimerFlag=false • 在脚本区左上角的对象下拉列表框中选择w_mainwin,在事件下拉列表框中选择mousedown事件,输入打开窗口的脚本:
3.5.2 窗口设计实例 • 选择w_mainwin 的rbuttondown事件,输入脚本 if TimerFlag=false then Timer(5) TimerFlag=true else Timer(0) TimerFlag=false end if • 选择w_mainwin 的timer事件,输入显示“消息框”脚本 MessageBox("消息框","计时时间到") 4.打开主窗口脚本 在树形结构区双击“应用”exwin,在弹出的“应用”的Open事件脚本区中编写如下代码:Open(w_mainwin) 5. 保存应用程序 运行应用程序。在应用程序主窗口中,按下左键。再按下右键,每隔5秒钟,弹出一个“计时时间到”消息框,再按一下右键,定时结束,不再弹出消息框。
3.6 小结 本章主要讲述了窗口对象的创建方法、窗口对象的基本属性、类型、事件以及函数。窗口为各种控件提供了发挥作用的舞台。有了窗口对象,再与随后各章陆续介绍的各种窗口控件以及数据窗口对象结合起来,就可以开发出功能强大的应用程序。