收藏 分销(赏)

第12章 窗口.ppt

上传人:pc****0 文档编号:13362314 上传时间:2026-03-07 格式:PPT 页数:50 大小:241.50KB 下载积分:10 金币
下载 相关 举报
第12章 窗口.ppt_第1页
第1页 / 共50页
第12章 窗口.ppt_第2页
第2页 / 共50页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,数据库管理系统,第十二章,窗口,12-1,窗口概述,12-2,窗口属性,12-3,窗口事件,12-4,窗口函数,12-5,窗口的继承,12-1,窗口概述,窗口是应用程序图形界面的基础,它由属性、事件、函数、控件组成,用户通过窗口及窗口上的控件和菜单表达自己的操作意图。在,PowerBuilder,中,窗口是个十分重要的对象,一般用窗口画笔来定义,我们将各种控件、菜单与窗口融合成一个整体作为应用程序与用户交互的界面。窗口可以显示信息,向用户请求信息,并能响应用户的键盘或鼠标操作。,12-1,窗口概述,窗口由四部分组成:,(1),属性:定义窗口的外观及行为(例如,窗口是否有标题条,窗口的颜色、大小、显示位置、边框形状等),(2),事件:发生在窗口上的事情,通过编写事件处理程序控制对用户操作如何响应,(3),函数:用于操作窗口,(4),控件:放置在窗口中的图形对象,用于请求、显示信息或操作,12-1,窗口概述,PowerBuilder,提供了六种窗口类型,每种类型都有其特殊用途,下面简单地介绍各窗口类型。,主窗口(,Main Window,),弹出式窗口(,Popup Window,),子窗口(,Child Window,),响应窗口(,Response Window,),MDI,框架窗口(,MDI Frame,)和带微帮助的,MDI,框架窗口(,MDI Frame,WithMicrohelp,),主窗口(,Main Window,),主窗口是独立的窗口,它不依赖于其它任何窗口而独立存在,这种类型的窗口既能够覆盖其它窗口,也能够被其它窗口覆盖。主窗口可以带有菜单,能够被最大化、最小化、或改变大小。对功能单一的应用,通常选用主窗口作界面基础。,弹出式窗口(,Popup Window,),弹出式窗口通常由另一个窗口打开,该窗口一般情况下成为弹出式窗口的父窗口。弹出式窗口显示在父窗口前面,它既可以移出父窗口,也能够覆盖父窗口,但不能被父窗口覆盖,当父窗口最小化时,弹出式窗口随之隐藏,父窗口被关闭时,弹出式窗口也随之关闭。根据需要,也可以把弹出式窗口设计成带有菜单、能够被最大化、最小化、或可改变大小的形式。弹出式窗口用途广泛,它可以显示文字信息,也可以作成图形化的进度提示窗口,还能够用于输入用户的选择。,子窗口(,Child Window,),正如其名字所暗示的那样,子窗口从属于另一个窗口,它总是在主窗口或弹出式窗口中打开,该窗口成为子窗口的父窗口。子窗口可以在父窗口内部移动,但不能移出父窗口。当子窗口的一部分移出父窗口时,系统剪裁子窗口,使得只有父窗口内的部分可见。移动父窗口时,子窗口随之移动,关闭父窗口时,子窗口也随之被关闭。子窗口可以有标题条,可以被最大化、最小化及改变大小,但它没有菜单,也不能被当作活动窗口。子窗口在最大化时,它充满父窗口的工作区;子窗口在最小化时,它缩小成图标显示在父窗口的底部。一般情况下,子窗口应用不多,如果需要子窗口的功能,则应该选用,MDI,窗口类型,它能够自动完成许多窗口管理工作,避免了一切从头做起的麻烦。,响应窗口(,Response Window,),响应窗口向用户请求信息,它总是在另一个窗口(父窗口)中打开。响应窗口被显示时,用户必须关闭了该窗口后才能操作同一个应用程序的其它窗口。响应窗口不能被最大化、最小化,但可以带有控制菜单。应用程序中经常使用的,About,(关于)窗口、,MessageBox,对话框都是响应窗口应用的具体实例。,MDI,框架窗口(,MDI Frame,)和带微帮助的,MDI,框架窗口(,MDI Frame,WithMicrohelp,),MDI,框架窗口及其子窗口构成了应用程序的多文档界面风格,它有两种形式:普通的,MDI,框架窗口和带微帮助的,MDI,框架窗口,两者的区别在于,后一种框架窗口在底部多了个状态栏,用于显示应用程序简短的当前信息,我们将其称做微帮助(,Microhelp,)。典型的,MDI,框架窗口由标题、菜单、工具栏、客户区、状态栏组成。,12-2,窗口属性,窗口属性定义窗口的外观、行为和状态,比如,窗口是哪种类型的窗口、是否要标题、要标题时标题是什么、窗口是否要菜单、窗口的颜色、位置、大小等。窗口对象的大部分属性均能修改,但也有部分属性系统不允许修改,例如,Control,数组。下面首先介绍,PowerBuilder,开发环境中设置窗口属性的步骤,同时分类说明常用窗口属性的作用和用法。,在窗口画板上设置窗口属性,在程序中设置窗口的属性,在窗口画板上设置窗口属性,设置窗口属性窗口有三十多个属性,在窗口画板上我们可以设置大部分常用的窗口属性,其设置步骤为:,(1),打开窗口,(2),在窗口属性对话框上设置窗口属性,在程序中设置窗口的属性,(1),Backcolor,long,设置窗口的背景色,w_1.backcolor=RGB(0,0,255),(2)Center,boolean,设置窗口是否居中显示,w_1.center=TRUE,(3)title string,设置窗口的标题,w_1.title=”,主窗口”,在程序中设置窗口的属性,(4)Visible,boolean,窗口是否可见,w_1.visible=FALSE,(5)Enabled,boolean,窗口是否可用,如果该属性是,false,则窗口变灰对任何操作均不响应,(6),位置属性,x integer y integer,窗口左上角的坐标,height integer width integer,窗口的高度和宽度,12-3,窗口事件,什么是事件:,事件指可能发生在对象上的事情。在,Windows,系统中,用户的所有操作都由系统自动转化为某个事件,比如,用户移动了鼠标,就会触发当前鼠标指针下对象的,MouseMove,事件;用户按下键盘上的某个按键,系统就会将这个操作转变成键盘事件。另外,系统的某些行为也将转换成事件来表现,比如定时器事件。为了简化应用程序的开发,大多数,PowerBuilder,对象都预先定义了一组事件。如果我们想对某个事件作出反应,那么就需要编写该事件的事件处理程序,这样,当相应事件发生时,事件处理程序就会被执行。如果没有对某个事件编写事件处理程序,那么当该事件发生时,应用程序什么也不做,就像没有发生这样的事件一样。除了用户操作应用程序能够产生事件外,程序本身也能够主动地触发事件,其目的在于简化编程任务。,12-3,窗口事件,当我们对某个事件编写了事件处理程序后,比如编写了窗口的,Clicked(,单击,),事件处理程序,当事件发生时(用户单击了窗口),事件处理程序就会执行,执行完毕后,窗口等待下一个事件的发生。窗口事件窗口对象具备丰富的预定义事件,有二、三十个。实际上,不需要对每个事件都编写事件处理程序,而只要对需要响应、需要处理的事件编写事件处理程序。,12-3,窗口事件,窗口对象中最常用的事件是,Open,、,Close,、,CloseQuery,、,Drag,事件、,Resize,,,Timer,其它事件普通编程使用不多。,open,事件,closequery,事件,close,事件,timer,事件,resize,事件,拖动事件,open,事件,当第一次打开窗口时,在窗口显示之前系统触发,Open,(打开)事件,在,Open,事件发生时,系统已经创建了窗口及窗口中的控件,因此,在这个事件的处理程序中,我们能够引用这些对象、修改它们的属性等,例如,在,Open,事件中可以将某个按钮暂时隐藏起来。窗口被打开后,窗口类型(,Window Type,)属性不能再被更改,例如,主窗口类型的窗口只能作为主窗口使用,而不能在事件处理程序中将它更改为响应窗口或弹出窗口。,我们可以在,open,事件中为,窗口控件设置初值。下述函数触发窗口的,Open,事件:,Open,、,OpenWithParm,、,OpenSheet,、,OpenSheetWithParm,closequery,事件,在开始关闭窗口时,发生该事件,该事件返回一个,0,或,1,的返回值。执行该事件的事件处理程序后,系统检查返回值,如果返回值为,1,,则窗口不被关闭,通常情况下紧随其后发生的,Close,事件不被产生;如果返回值为,0,,则窗口被关闭。利用该事件的这种特性,程序能够根据当前状态提醒用户保存数据、询问用户是否真要关闭窗口。,closequery,事件,例如在关闭窗口前询问是否关闭窗口。,Int,ret,Ret=,messagebox,(“,请注意”,”,是否关闭窗口,?”,question!,yesno!,2),If ret=1 then,Return 0,Else,Return 1,End if,close,事件,窗口被关闭时发生。触发该事件后,没有办法能够阻止窗口关闭操作。一般在该事件中做一些清除工作,清除窗口创建的一些对象。,timer,事件,在调用,Timer,函数启动定时器、设定时间后发生。,在应用,timer,事件编程时,首先要使用,timer,函数设定定时器,在定时器规定的时间间隔触发,timer,事件。,Timer(,时间间隔,),以秒为单位,,timer(0),关闭定时器,创建定时器后要注意关闭定时器,因为定时器会消耗内存。,timer,事件,例如:我们创建一个时钟窗口,W_1St_1,在,w_1,的,open,事件中设置定时器,timer(1),在,w_1,的,timer,事件中显示当前时间,st_1.Text=,String(Now,(),hh:mm:ss,),在,w_1,的,close,事件中关闭定时器,timer(0),W_1,St_1,resize,事件,入口参数:,ULong,sizetype,:指明改变窗口大小的类型,例如:,0,:,(SIZE_RESTORED),窗口不是由于最小化或最大化发生改变,1,:,(SIZE_MINIMIZED),由于最小化,2,:,(SIZE_MAXIMIZED),由于最大化,Integer,newwidth,:窗口新的客户区宽度,Integer,newheight,:窗口新的客户区高度,一般我们在这个事件中来改变窗口中控件的大小,使它们按窗口的比例进行改变。,改变窗口大小和位置的操作均会触发该事件,resize,事件,例如:在窗口,w_1,的大小发生变化时修改多行编辑器,mle_1,的大小,W_1Mle_1,1,、声明实例变量,int,old_width,old_height,用于存放窗口的原大小,W_1,Mle_1,resize,事件,2,、在,w_1,的,open,事件中:,old_width,=,this.width,old_height,=,this.height,3,、在,w_1,的,resize,事件中:,int,x_bl,y_bl,x_bl,=,this.width,-,old_width,y_bl,=,this.height,-,old_height,mle_1.width=mle_1.width+x_bl,mle_1.height=mle_1.height+y_bl,old_width,=,this.width,old_height,=,this.height,拖动事件,dragenter,dragwithin,dragleave,12-4,窗口函数,powerbuilder,系统为窗口对象提供了,30,多个函数,我们现在学习常用的几个函数。,打开窗口函数,关闭窗口函数,得到窗口上当前鼠标的位置,改变窗口位置的函数,触发事件函数,在两个窗口之间传递参数,用户自定义窗口函数,打开窗口函数,1.,格式一,open(,窗口,,父窗口,),第一个参数是要打开的窗口名,可以是在窗口画板上定义的窗口,也可以是窗口实例。,第二个参数是该窗口父窗口。,什么是窗口实例?在窗口画笔中设计好窗口后,在某个事件处理程序中通过,Open(),函数打开窗口,此后运行程序时窗口才出现在屏幕上。,建立应用时,有时我们希望显示几个结构相同但数值不同的窗口,例如,我们已经有了一个,w_person,窗口,它用于显示单个人员的信息,现在我们希望通过打开多个,w_person,窗口同时显示多个人员的信息。一个通常会想到的办法是,多执行几次,Open(w_person,),函数,试一试就会发现,屏幕上只有一个,w_person,窗口,.,打开窗口函数,例如:,(1),在窗口画板上定义了窗口,w_person,,,open(w_person,),(2),在窗口画板上定义了窗口,w_person,(,child!,),w_main(main,!),,将,w_person,作为,w_main,的子窗口打开。,Open(w_person,w_main,),(3),打开两个,w_person,窗口,w_person,w_1,w_2,open(w_1),open(w_2),打开窗口函数,2,格式二,动态打开窗口,前一种格式我们在编译程序时已经知道要打开窗口的类型,当我们在写程序时不知道要打开窗口的类型时可以用第二种格式打开窗口。,Open(,窗口变量,窗口类型,,父窗口,),窗口变量与父窗口的含义与格式一相同,窗口类型是一个存放窗口类名的字符串(,string,)。,例如:,string,window_type,window w_open1,w_open2,window_type,=”,w_person,”,open(w_open1,window_type),open(w_open2,window_type),关闭窗口函数,打开的窗口不再使用时,应该及时将其关闭,以释放系统资源。关闭窗口的工作由函数,Close(),实现,其语法格式为:,close(,窗口,),使用窗口名:,close(w_main,),使用代词:,close(parent,),close(this,),得到窗口上当前鼠标的位置,PointX(),PointY,(),,得到鼠标当前窗口的坐标。,改变窗口位置的函数,1,Move(int,x,int,y),将窗口移动到指定的位置。实际上是修改窗口属性的,x,y,2,显示隐藏窗口,show(),显示窗口,实际上将窗口的,visible,属性设置为,TRUE,hide(),隐藏窗口,实际上将窗口的,visible,属性设置为,FALSE,触发事件函数,TriggerEvent,(),和,PostEvent,(),。,当我们为某个对象的某个事件编写了事件处理程序后,在其它地方(比如函数或其它事件处理程序)就可以调用该事件处理程序,完成这项工作的一个简便方法是使用对象函数,TriggerEvent,(),或,PostEvent,(),。,由于,TriggerEvent,(),函数立即触发相应事件,故将其称为事件触发函数,而,PostEvent,(),函数将事件放置到消息队列的尾部,等待系统来处理,故将其称为事件邮寄函数,下面分别介绍这两个函数。,触发事件函数,1,、事件触发函数,TriggerEvent,(),TriggerEvent,(),函数,TriggerEvent,(),函数能够触发任何对象的事件,并立即执行该事件的事件处理程序,其语法格式为:,objectname.TriggerEvent,(event,word,long,其中:,objectname,是对象或控件名称,将触发该对象或控件的某个事件;,event,是要触发的事件,其有效值既可以是标识,PowerBuilder,事件的,TriggerEvent,枚举类型值(比如,Clicked!,、,Modified!,、或,DoubleClicked,!,等,也可以是表示事件名称的字符串(例如自定义事件,cb_exit_request,);,word,和,long,是两个可选参数,触发事件后其值将分别保存到系统全局对象,Message,的,WordParm,和,LongParm,属性中。,触发事件函数,例如:,语句:,cb_OK.TriggerEvent(Clicked,!),触发命令按钮,cb_OK,的单击事件(,Clicked,),并立即执行该事件的事件处理程序。,语句:,Parent.TriggerEvent(cb_exit_request,),触发父窗口的自定义事件“,cb_exit_request,”,,并立即执行该事件的事件处理程序。,TriggerEvent,(),很像函数调用,执行该函数时,程序进入被触发事件的事件处理程序中执行,执行完毕后返回到,TriggerEvent,(),语句下面一行语句继续执行,触发事件函数,2,、邮寄函数,PostEvent,(),函数,PostEvent,(),的语法格式为:,objectname.PostEvent,(event,word,long),各参数的意义与,TriggerEvent,(),函数相同。虽然语法格式上,PostEvent,(),与,TriggerEvent,(),相同,但,PostEvent,(),函数只是邮寄一个事件,要求,PowerBuilder,在以后的某个时间执行邮寄事件的事件处理程序,具体时间由,PowerBuilder,决定,之后当前程序继续执行。,TriggerEvent,(),通常用做同步调用,因为它等待被调用者执行完毕后才继续运行,而,PostEvent,(),通常用做异步调用,它在发出请求执行信号后就继续运行自己的程序段了。,触发事件函数,例子:在双击窗口,w_1,时,触发按钮,cb_ok,的,clicked,事件,在,w_1,的,doubleclicked,事件中:,cb_ok.triggerevent(clicked,!),或,cb_ok.postevent(clicked,!),在两个窗口之间传递参数,在两个窗口之间传递参数是通过,message,对象作为媒介,来进行参数传递的。,1,带参数打开窗口,有些窗口应用程序要反复使用,每次使用时都向窗口提供不同的参数,此时,利用带参数打开窗口函数,OpenWithParm,(),既方便又简单。与,Open(),函数一样,,OpenWithParm,(),函数也有两种语法格式:,第一种格式打开一个设计程序时就已经知道其类类型的窗口对象,第二种格式打开一个程序运行时才知道其类类型的窗口对象。,我们只介绍第一种。,在两个窗口之间传递参数,第一种语法格式为:,OpenWithParm,(,windowvar,parameter,parent),其中,,windowvar,是你想显示的窗口的名称;,parameter,是希望传递的参数,该参数将被放置到系统缺省的全局对象,Message,中。,parameter,的数据类型只能是下述三种类型之一:,(,1,),String,,字符串,(,2,),Numeric,,系统支持的所有数值数据类型,包括,PowerBuilder,的数值数据类型,integer,、,long,、,decimal,、,real,、,double,、,UnsignedInteger,以及当前数据库管理系统支持的数值数据类型。,(,3,),PowerObject,,,PowerBuilder,系统对象的基类,实际上包括了,PowerBuilder,的所有对象。,在两个窗口之间传递参数,parent,是个可选参数,未省略时,由该参数指定父窗口的名称,此时,被打开窗口作为子窗口形式出现。,OpenWithParm,(),函数返回整型值,1,表示打开窗口成功,返回整型值,-1,表示打开失败。,打开窗口时,,OpenWithParm,(),函数把参数,parameter,保存到系统缺省的全局对象,Message,中,根据数据类型的不同,在被打开窗口的事件处理程序中,通过检查,Message,对象的相应属性得到打开函数传递来的参数值,参数类型及,Message,对象相应属性的对应关系如表。,在两个窗口之间传递参数,parameter,数据类型及其使用的,Message,属性,在被打开窗口中,应该尽早地检查,Message,对象相应的属性,原因在于该对象是全局对象,其它程序完全可能为其它目的使用该对象。,parameter,数据类型,使用的,Message,属性,Numeric,Message.DoubleParm,PowerObject,(包括各种对象以及用户自定义结构),Message.PowerObjectParm,String,Message.StringParm,在两个窗口之间传递参数,下面的语句打开窗口,w_employee,,并用,w_employee,引用该窗口,打开窗口的同时向窗口传递一个字符串型参数“李方”:,OpenWithParm(w_employee,李方,),在窗口,w_employee,的,Open,事件中,可以用下述语句把,OpenWithParm,(),传递来的参数显示在单行编辑框,st_empname,中:,st_empname.Text,=,Message.StringParm,在两个窗口之间传递参数,2,带参数关闭窗口,在响应窗口(,Response Window,)中,我们可以使用,CloseWithReturn,(),函数在关闭窗口的同时向打开该窗口的程序返回一个值。与,OpenWithParm,(),函数相似,,CloseWithReturn,(),函数同样借用全局对象,Message,保存返回的值。,CloseWithReturn,(),函数的语法格式为:,CloseWithReturn,(,windowname,returnvalue,),在两个窗口之间传递参数,其中,,windowname,是要关闭的窗口;,returnvalue,是返回值,该值保存在消息对象,Message,的属性中。,returnvalue,只能是下述三种数据类型之一:,String,、,Numeric,、,PowerObject,,具体解释请参见,OpenWithParm,(),函数。,下面的语句假设放在某个响应窗口上的某按钮的事件处理程序中,用户单击了该按钮后将关闭窗口,同时返回一个字符串“张三”:,CloseWithReturn(Parent,张三,),打开响应窗口的程序可通过下述语句得到响应窗口的返回值:,ret_name,=,Message.StringParm,用户自定义窗口函数,自定义窗口函数的过程见书上,45,页。,窗口函数的使用有静态调用和动态调用两种。,1,、静态调用:,是系统省缺的调用函数的方式,是系统在编译代码时就对函数进行彻底的编译,对返回值及入口参数进行检查和匹配,出现问题立即报告错误。,例如:,int,value=w_1.addfunc(),用户自定义窗口函数,2,、动态调用,在程序执行时才会去查找和调用响应的函数,而在程序编译时可以没有该函数。优点是程序的开发具有极大的灵活性,缺点降低了程序运行的速度。,Int,value=w_1.dynamic,addfunc,(),12-5,窗口的继承,面向对象的特点之一是对象具有继承性,,PB,的窗口也有继承性。,为什么要使用继承,怎样建立继承窗口,窗口继承后将会将祖先窗口中的控件、代码、事件完全继承下来,后代可以引用祖先的函数、事件以及结构,也可以添加新的函数、控件等。,为什么要使用继承,下面两种情况下我们要使用继承:,(,1,)需要创建若干个窗口,这些窗口有一些共同之处。,(,2,)有一个或多个窗口都是在某个窗口上添加一些控件和处理函数得到。,怎样建立继承窗口,选择,file,中的,inherient,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服