PB窗口使用技巧_第1页
PB窗口使用技巧_第2页
PB窗口使用技巧_第3页
PB窗口使用技巧_第4页
PB窗口使用技巧_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、PB-窗口使用技巧*在打开和关闭窗口时进行数据传递OpenWithParm(windowvar,parmeter,parent)其中windowvar是要打开的窗口名称,可以是window画板中定义的窗口,也可以是脚本中定义的窗口变量;parameter是要传递的参数,只能是String,Numeric或者PowerObject类型,该参数根据类型保存在Message的成员变量中传递个要打开的窗口;parent是一个已经打开的窗口名称,该窗口要成为windowvar窗口的父窗口。函数执行成功返回1,否则返回-1,如果有参数为null则返回null。对象Message是一个结构类型的全局变量,并

2、有很多的成员变量。在传递参数时三个成员变量用来读取传递的数据,它们是:Message.DoubleParm:用来传递Numeric类型的数据。Message.PowerObjectParm:用来传递PowerObject对象类型的数据,象数据窗口、按键、列表框和拥护自定义的结构等都可以使用该变量进行传递。Message.StringParm:用来传递String类型的数据。当使用函数OpenWithParm打开窗口后,应该在进行其他操作之前首先读取传递过来的参数,以免其他操作修改Message中的成员变量。CloseWithReturn(windowname,Returnvalue)其中,wi

3、ndowname是要关闭的窗口的名称,一般是脚本所在的窗口的名称;Returnvalue是要返回的数值,和上述函数OpenWithParm的完全相同。函数正确执行返回1,否则返回-1,当有参数为null时则返回null。*只要是response类型的窗口,使用该函数就能有效地传递参数;该窗口不一定非得是用OpenWithParm打开的。在打开该response的窗口中可以读取传递过来的参数。总之,使用CloseWithReturn函数时一定要注意,只有被关闭的窗口是response类型才能有效地获取返回参数。另外需要说明一点是,某些情况下需要直接修改Message成员变量的取值才能正确返回值。

4、比如,在一个数据窗口中,经常需要在窗口的CloseQuery事件中判断数据是否已经修改:如果修改,则直接保存,这时返回是否保存过数据的相应标记。在CloseQuery事件中使用函数CloseWithReturn不能正确返回值,只好直接修改Message成员变量的取值了。*使用窗口名加界定符再加变量的形式可以应用其他窗口中的变量或者函数。例如,要想在窗口w_parm中引用窗口w_data中的实例变量is_title,可以使用w_data.is_title来引用。引用变量既可以使用其他的取值,也可以给它赋值,只要变量的定义允许这些操作。*打开多个相同的窗口打开多个相同窗口,是否可以多次使用open

5、语句来解决这个问题呢?不行,该语句只能激活已经打开的窗口,而不会重新打开一个窗口。只能通过创建实例来解决这个问题。如:在按钮的clicked事件中,多次点击该按钮就会打开多哥完全相同的实例窗口。w_edit lw_editopen(lw_edit)如果希望一次打开多个实例窗口,可以使用数组:w_edit lw_edit3int li_ifor li_i = 1 to 3open(lw_editli_i)next*在同一事件中(如,点击一次按钮)对一个窗口实例变量重复执行open语句也只能打开一个实例如,下面的脚本只能打开一个实例窗口w_edit lw_editint li_ifor li_i

6、= 1 to 3open(lw_edit)next还可以使用如下的语句打开实例窗口window lw_edit3string ls_win = "w_main"int li_ifor li_i = 1 to 3open(lw_editli_i,ls_win)next打开一个实例时,可以直接使用实例变量的名字引用实例窗口w_edit lw_editopen(lw_edit)lw_edit.title = "测试"*窗口的属性tag属性tag可以应用于所有的控件、用户对象与菜单,用来保存和控件相关的文本。control使用该属性可以引用窗口中的控件,它是一个

7、包含窗口中所有控件的数组,可以按只读方式引用其中的控件。配合函数TypeOf可以判断控件的类型,根据类型编写相应的脚本。实现对窗口中各个控件复位操作:Int li_index,li_totalDataWindow ldw_tempDropDownListbox lddlb_tempRadioButton lrb_templi_total = Upperbound(Parent.Control)For li_index = 1 To li_totalChoose Case Parent.Controlli_index.TypeOf()Case DataWindow!ldw_temp = Pare

8、nt.Controlli_indexldw_temp.Reset()Case DropDownListBox!lddlb_temp = Parent.Controlli_indexlddlb_temp.SelectItem(0)Case RadioButTon!lrb_temp = Parent.Controlli_indexlrb_temp.Checked = FalseCase ElseEnd ChooseNextMenuId该属性是一个指针,并指向和窗口相关联的菜单。在MDI应用程序中,多个工作表都能通过该指针引用其他菜单的实例,程序员可以编写出更为通用的脚本。WindowState该属

9、性是一个枚举型属性,可以取值为Maximized!,Minimized!和Normal!。通过该属性可以判断当前窗口的状态,也可以使用脚本直接修改该属性来改变窗口的状态。*窗口最小化时设置动态图标当应用程序最小化时,程序的图标如果是动画的,肯定更能吸引用户的注意,视觉效果会更好。方法是通过动态修改程序的图标来实现。当程序最小化时打开timer(在deactive中加入timer(1)语句),并在timer事件中编写如下程序: If This.Icon = "appico.ico" ThenThis.Icon = "reverse.ico"ElseThis

10、.Icon = "appico.ico"End If程序激活时关闭Timer事件(在Active事件中加入timer(0)语句)。需要注意,要将上面用到的两个ico文件放到当前应用程序的目录中。*放置闪烁文字以闪烁文字显示重要信息可以吸引用户的注意力,避免这些重要信息被忽略。通过周期性修改visible属性,可以实现闪烁效果。在窗口中,假设放置一个静态文本st_1,在窗口的Open事件中定义Timer事件的间隔:Timer(1)然后,在窗口的Timer事件中定期修改静态文本的visible属性:If Mod(Second(Now(),2) = 1 Thenst_1.visi

11、ble = FalseElsest_1.Visible = TrueEnd If这样就可以实现闪烁效果。当然也可以在适当的时候使用timer(1),并在适当的时候关闭Timer事件。*函数PostEvent和TriggerEvent都可以触发其他的事件,但是两者是有区别的。PostEvent触发的事件不是马上执行,而TriggerEvent触发的事件马上执行。PostEvent向消息队列中发送消息,等当前脚本执行完毕再触发消息队列中等待状态事件的脚本;而TriggerEvent函数可以中断当前执行的脚本,转向被触发事件,等执行完被触发事件的脚本后再返回当前脚本继续执行所以,当需要马上执行被触发

12、的事件时使用函数TriggerEvent;当执行完当前脚本后需要触发某个事件时使用函数PostEvent。但是,当在脚本最后触发其他事件时不论使用哪个函数,效果都相同。*移动不带标题栏的窗口在开发应用程序中,可能要用到不带标题栏的窗口,而带有标题栏的窗口可以通过拖动标题栏来移动窗口,如何移动没有标题栏窗口呢?这需要编写代码来解决。在要拖动窗口的MouseDown事件中编写脚本,给窗口发送消息WM_SYSCOMMAND,并将Wordparm设置成SC_MOVE+1,这两个常数的取值分别为274和61 457。脚本如下:Send(handle(this),274,61458,0)这将通知窗口在鼠标

13、移动时跟随它一起移动。*闪烁窗口标题栏可以使用API函数FlashWindow来实现闪烁窗口标题栏的功能,使用该功能可以在重要窗口或者特殊情况下吸引用户的注意力。首先声明Locat External Function,语句如下:Function boolean FlashWindow (Uint handle, boolean flash) Library "user.exe"然后在适当的时候(比如,用户点击了某个按键后)使用下面语句设置Timer事件的间隔:Timer(1)然后在窗口的Timer事件中编写如下脚本:FlashWindow(Handle(This),True

14、)在适当的时候使用timer(0)语句关闭Timer事件。*给窗口添加自动滚动条功能因为窗口没有自动滚动条功能,如果设置窗口的HScrollBar或者VScrollBar属性,在不需要滚动条时也显示滚动条,很不美观。可以在窗口的Resize事件中编写脚本,根据当前窗口的大小来设置是否显示滚动条。如果用户调整窗口的宽度,当小于打开时的宽度时显示水平滚动条,当大于打开时的宽度时,如果有水平滚动条,则取消该滚动条;如果用户调整窗口的高度,当小于打开时的高度时显示垂直滚动条,当大于打开时的高度时,如果有垂直滚动条,则取消该滚动条。脚本主要编写在窗口的Resize事件中,需要两个判断滚动条滚动范围和滚动

15、条当前位置的API函数,声明这两个本地外部函数的语句是:Subroutine GetScrollRange(Uint hWindow,Int nScrollBarFlag,ref Int nMin,ref Int nMax) Library "user.exe"Function Int GetScrollPos(Uint hWindow,Int nScrollBarFlag) Library "user.exe"是否需要显示滚动条,可以通过和窗口刚打开时的宽度、高度相比较来判断。所以,定义两个实例变量:Int ii_width,ii_height在窗口的

16、Open事件中初始化这两个变量:ii_width = This.Widthii_height = This.Height然后是脚本的主要部分,在窗口的Resize事件中实现。脚本如下:Uint hwindowInt nScrollPos,nMinPos,nMaxPosIf This.WindowState = Minimized! Then /如果正在进行最小化,则直接返回ReturnEnd IfHWindow = Handle(This) /获取当前窗口的句柄/下面开始处理水平滚动条If This.Width < i_Width Then /如果小于打开时的宽度This.Hscroll

17、Bar = True /则显示水平滚动条Elseif This.HscrollBar Then /如果大于或等于打开时的宽度,并且已经有滚动条NScrollPos = GetScrollPos(hwindow,0) /使用API函数获取当前滚动条位置GetScrollRange(hwindow,0,nMinPos,nMaxPos) /使用API函数获取滚动范围If nScrollPos > nMinPos Then /如果用户滚动了滚动条并且此时不需要显示滚动条Post(hwindow,276,6,0) /则在水平方向调整窗口中的内容到原来的位置End IfThis.HscrollBar

18、 = False /取消滚动条特性End If/下面开始处理垂直滚动条If This.Height < i_Height Then /如果小于打开时的高度This.VscrollBar = True /则显示垂直滚动条Elseif This.VscrollBar Then /如果大于或等于打开时的高度,并且已经有滚动条NScrollPos = GetScrollPos(hWindow,1) /使用API函数获取当前滚动条位置GetScrollRange(hwindow,1,nMinpos,nMaxPos) /使用API函数获取滚动范围If nScrollPos > nMinPos

19、Then /如果用户滚动了垂直滚动条且不需再显示Post(hwindow,277,6,0) /则垂直调整窗口中的内容到原来的位置End IfThis.VscrollBar = False /取消滚动条特性End If*自动调整窗口在一定的屏幕分辨率下开发的应用程序到别的计算机上运行时,很可能遇到和开发环境中的分辨率不同的情况,这时要保证窗口界面仍然显示居中,就得在开发时考虑这个问题。解决方法是在窗口打开时判断屏幕的分辨率,根据分辨率来决定窗口显示的位置。要用到两个单位换算函数和一个获取运行环境信息的函数。在PowerBuilder中所有尺度都是用PowerBuilder单位(PBU)计量的,惟

20、一例外是Window和DataWindow画扳网格尺寸,这是用像素计量。PowerBuilder中的计量使用和Windows中相同的技术,都是基于系统字体。不同的是,Windows中采用系统字体宽度的1/4和高度的1/8,而PowerBuilder中采用系统字体宽度的1/32和高度的1/64,从而可以提供比Windows中更高的分辨率。但是,用户在PowerBuilder应用程序中调用外部函数来获取对象的尺寸或位置时就应该进行相应的转换。好在PowerBuilder本身也提供了进行单位换算的函数,所以应该尽量使用PowerBuilder本身的单位换算函数。函数UnitsToPixels()用于

21、将PBU值换算成像素值。它的语法格式是:UnitsToPixels(units,type)其中,Units是一个整型数值,是要转换成像素值的PBU值;Type是一个ConvertType类型的枚举值,可以是:XUnitsToPixels!表示要转换成水平方向上的像素值;YUnitsToPixels!表示要转换成垂直方向上的像素值。函数成功执行将返回转换后的像素值,如果执行错误,则返回-1,如果有参数NULL,则返回NULL。函数PixelsToUnits用于将像素值转换算成PBU值。它的语法格式是:PixelsToUnits(pixels,type)各个参数的意义和上面函数的完全相同,执行的功

22、能相反,是将指定像素值转换成指定方向上的PBU值。因为所有窗口在打开时都有居中问题,所以可以使用全局函数解决这个问题,以便在应用中的所有窗口都可以调用该函数。该函数的脚本如下:/-/功能:将窗口移到屏幕的中央/参数:aw_window 要处理的窗口/返回值:(none)/调用举例:gf_window_center(w_pay_mode)/-Environment le_envinteger li_iscreenHeight,li_screenWidthlong ll_posx,ll_posyGetEnvironment(le_env)li_screenHeight = PixelsToUnit

23、s(le_env.screenHeight,YPixelsToUnits!)li_screenWidth = PixelsToUnits(le_env.screenWidth,XPixelsToUnits!)if aw_window.width > li_screenWidth thenll_posx = 1elsell_posy = (li_screenWidth - aw_window.width)/2end ifif aw_window.height > li_screenHeight thenll_posy = 1elsell_posy = (li_screenHeight - aw_window.Height)/2end ifaw_window.Move(ll_posx,ll_posy)上面的脚本用函数GetEnvironment获取当前的环境信息,并将其成员变量ScreenWidth和ScreenHeight转换成PBU值,然后减去当前窗口的宽(高),取

温馨提示

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

评论

0/150

提交评论