




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PB-窗口使用技巧 *在打开和关闭窗口时进行数据传递 OpenWithParm(windowvar,parmeter,parent) 其中 windowvar是要打开的窗口名称,可以是 window画板中定义的窗口,也可 以是脚本中定义的窗口变量;parameter 是要传递的参数,只能是 String,Numeric 或者 PowerObject类型,该参数根据类型保存在 Message的 成员变量中传递个要打开的窗口;parent 是一个已经打开的窗口名称,该窗口 要成为 windowvar窗口的父窗口。函数执行成功返回 1,否则返回-1,如果有 参数为 null则返回 null。 对象 Message是一个结构类型的全局变量,并有很多的成员变量。在传递参数 时三个成员变量用来读取传递的数据,它们是: Message.DoubleParm:用来传递 Numeric类型的数据。 Message.PowerObjectParm:用来传递 PowerObject对象类型的数据,象数据窗 口、按键、列表框和拥护自定义的结构等都可以使用该变量进行传递。 Message.StringParm:用来传递 String类型的数据。 当使用函数 OpenWithParm打开窗口后,应该在进行其他操作之前首先读取传递 过来的参数,以免其他操作修改 Message中的成员变量。 CloseWithReturn(windowname,Returnvalue) 其中,windowname 是要关闭的窗口的名称,一般是脚本所在的窗口的名称; Returnvalue是要返回的数值,和上述函数 OpenWithParm的完全相同。函数正 确执行返回 1,否则返回-1,当有参数为 null时则返回 null。 *只要是 response类型的窗口,使用该函数就能有效地传递参数;该窗口不一 定非得是用 OpenWithParm打开的。在打开该 response的窗口中可以读取传递 过来的参数。 总之,使用 CloseWithReturn函数时一定要注意,只有被关闭的窗口是 response类型才能有效地获取返回参数。 另外需要说明一点是,某些情况下需要直接修改 Message成员变量的取值才能 正确返回值。比如,在一个数据窗口中,经常需要在窗口的 CloseQuery事件中 判断数据是否已经修改:如果修改,则直接保存,这时返回是否保存过数据的 相应标记。在 CloseQuery事件中使用函数 CloseWithReturn不能正确返回值, 只好直接修改 Message成员变量的取值了。 *使用窗口名加界定符再加变量的形式可以应用其他窗口中的变量或者函数。 例如,要想在窗口 w_parm中引用窗口 w_data中的实例变量 is_title,可以使 用 w_data.is_title来引用。引用变量既可以使用其他的取值,也可以给它赋 值,只要变量的定义允许这些操作。 *打开多个相同的窗口 打开多个相同窗口,是否可以多次使用 open语句来解决这个问题呢?不行,该 语句只能激活已经打开的窗口,而不会重新打开一个窗口。只能通过创建实例 来解决这个问题。 如:在按钮的 clicked事件中,多次点击该按钮就会打开多哥完全相同的实例 窗口。 w_edit lw_edit open(lw_edit) 如果希望一次打开多个实例窗口,可以使用数组: w_edit lw_edit3 int li_i for li_i = 1 to 3 open(lw_editli_i) next *在同一事件中(如,点击一次按钮)对一个窗口实例变量重复执行 open语句 也只能打开一个实例 如,下面的脚本只能打开一个实例窗口 w_edit lw_edit int li_i for li_i = 1 to 3 open(lw_edit) next 还可以使用如下的语句打开实例窗口 window lw_edit3 string ls_win = “w_main“ int li_i for li_i = 1 to 3 open(lw_editli_i,ls_win) next 打开一个实例时,可以直接使用实例变量的名字引用实例窗口 w_edit lw_edit open(lw_edit) lw_edit.title = “测试“ *窗口的属性 tag 属性 tag可以应用于所有的控件、用户对象与菜单,用来保存和控件相关的文 本。 control 使用该属性可以引用窗口中的控件,它是一个包含窗口中所有控件的数组,可 以按只读方式引用其中的控件。配合函数 TypeOf可以判断控件的类型,根据类 型编写相应的脚本。 实现对窗口中各个控件复位操作: Int li_index,li_total DataWindow ldw_temp DropDownListbox lddlb_temp RadioButton lrb_temp li_total = Upperbound(Parent.Control) For li_index = 1 To li_total Choose Case Parent.Controlli_index.TypeOf() Case DataWindow! ldw_temp = Parent.Controlli_index ldw_temp.Reset() Case DropDownListBox! lddlb_temp = Parent.Controlli_index lddlb_temp.SelectItem(0) Case RadioButTon! lrb_temp = Parent.Controlli_index lrb_temp.Checked = False Case Else End Choose Next MenuId 该属性是一个指针,并指向和窗口相关联的菜单。在 MDI应用程序中,多个工 作表都能通过该指针引用其他菜单的实例,程序员可以编写出更为通用的脚本。 WindowState 该属性是一个枚举型属性,可以取值为 Maximized!,Minimized!和 Normal!。 通过该属性可以判断当前窗口的状态,也可以使用脚本直接修改该属性来改变 窗口的状态。 *窗口最小化时设置动态图标 当应用程序最小化时,程序的图标如果是动画的,肯定更能吸引用户的注意, 视觉效果会更好。方法是通过动态修改程序的图标来实现。 当程序最小化时打开 timer(在 deactive中加入 timer(1)语句),并在 timer 事件中编写如下程序: If This.Icon = “appico.ico“ Then This.Icon = “reverse.ico“ Else This.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 Then st_1.visible = False Else st_1.Visible = True End If 这样就可以实现闪烁效果。当然也可以在适当的时候使用 timer(1),并在适当 的时候关闭 Timer事件。 *函数 PostEvent和 TriggerEvent都可以触发其他的事件,但是两者是有区别 的。PostEvent 触发的事件不是马上执行,而 TriggerEvent触发的事件马上执 行。PostEvent 向消息队列中发送消息,等当前脚本执行完毕再触发消息队列 中等待状态事件的脚本;而 TriggerEvent函数可以中断当前执行的脚本,转向 被触发事件,等执行完被触发事件的脚本后再返回当前脚本继续执行所以,当 需要马上执行被触发的事件时使用函数 TriggerEvent;当执行完当前脚本后需 要触发某个事件时使用函数 PostEvent。但是,当在脚本最后触发其他事件时 不论使用哪个函数,效果都相同。 *移动不带标题栏的窗口 在开发应用程序中,可能要用到不带标题栏的窗口,而带有标题栏的窗口可以 通过拖动标题栏来移动窗口,如何移动没有标题栏窗口呢?这需要编写代码来 解决。 在要拖动窗口的 MouseDown事件中编写脚本,给窗口发送消息 WM_SYSCOMMAND,并将 Wordparm设置成 SC_MOVE+1,这两个常数的取值分别为 274和 61 457。脚本如下: Send(handle(this),274,61458,0) 这将通知窗口在鼠标移动时跟随它一起移动。 *闪烁窗口标题栏 可以使用 API函数 FlashWindow来实现闪烁窗口标题栏的功能,使用该功能可 以在重要窗口或者特殊情况下吸引用户的注意力。首先声明 Locat External Function,语句如下: Function boolean FlashWindow (Uint handle, boolean flash) Library “user.exe“ 然后在适当的时候(比如,用户点击了某个按键后)使用下面语句设置 Timer 事件的间隔: Timer(1) 然后在窗口的 Timer事件中编写如下脚本: FlashWindow(Handle(This),True) 在适当的时候使用 timer(0)语句关闭 Timer事件。 *给窗口添加自动滚动条功能 因为窗口没有自动滚动条功能,如果设置窗口的 HScrollBar或者 VScrollBar 属性,在不需要滚动条时也显示滚动条,很不美观。可以在窗口的 Resize事件 中编写脚本,根据当前窗口的大小来设置是否显示滚动条。如果用户调整窗口 的宽度,当小于打开时的宽度时显示水平滚动条,当大于打开时的宽度时,如 果有水平滚动条,则取消该滚动条;如果用户调整窗口的高度,当小于打开时 的高度时显示垂直滚动条,当大于打开时的高度时,如果有垂直滚动条,则取 消该滚动条。 脚本主要编写在窗口的 Resize事件中,需要两个判断滚动条滚动范围和滚动条 当前位置的 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 在窗口的 Open事件中初始化这两个变量: ii_width = This.Width ii_height = This.Height 然后是脚本的主要部分,在窗口的 Resize事件中实现。脚本如下: Uint hwindow Int nScrollPos,nMinPos,nMaxPos If This.WindowState = Minimized! Then /如果正在进行最小化,则直接返 回 Return End If HWindow = Handle(This) /获取当前窗口的句柄 /下面开始处理水平滚动条 If This.Width nMinPos Then /如果用户滚动了滚动条并且此时不需要显示 滚动条 Post(hwindow,276,6,0) /则在水平方向调整窗口中的内容到原来的位置 End If This.HscrollBar = False /取消滚动条特性 End If /下面开始处理垂直滚动条 If This.Height nMinPos Then /如果用户滚动了垂直滚动条且不需再显示 Post(hwindow,277,6,0) /则垂直调整窗口中的内容到原来的位置 End If This.VscrollBar = False /取消滚动条特性 End If *自动调整窗口 在一定的屏幕分辨率下开发的应用程序到别的计算机上运行时,很可能遇到和 开发环境中的分辨率不同的情况,这时要保证窗口界面仍然显示居中,就得在 开发时考虑这个问题。解决方法是在窗口打开时判断屏幕的分辨率,根据分辨 率来决定窗口显示的位置。要用到两个单位换算函数和一个获取运行环境信息 的函数。 在 PowerBuilder中所有尺度都是用 PowerBuilder单位(PBU)计量的,惟一例外 是 Window和 DataWindow画扳网格尺寸,这是用像素计量。PowerBuilder 中的 计量使用和 Windows中相同的技术,都是基于系统字体。不同的是,Windows 中采用系统字体宽度的 1/4和高度的 1/8,而 PowerBuilder中采用系统字体宽 度的 1/32和高度的 1/64,从而可以提供比 Windows中更高的分辨率。但是, 用户在 PowerBuilder应用程序中调用外部函数来获取对象的尺寸或位置时就应 该进行相应的转换。好在 PowerBuilder本身也提供了进行单位换算的函数,所 以应该尽量使用 PowerBuilder本身的单位换算函数。 函数 UnitsToPixels()用于将 PBU值换算成像素值。它的语法格式是: UnitsToPixels(units,type) 其中,Units 是一个整型数值,是要转换成像素值的 PBU值;Type 是一个 ConvertType类型的枚举值,可以是: XUnitsToPixels!表示要转换成水平方向上的像素值; YUnitsToPixels!表示要转换成垂直方向上的像素值。 函数成功执行将返回转换后的像素值,如果执行错误,则返回-1,如果有参数 NULL,则返回 NULL。 函数 PixelsToUnits用于将像素值转换算成 PBU值。它的语法格式是: PixelsToUnits(pixels,type) 各个参数的意义和上面函数的完全相同,执行的功能相反,是将指定像素值转 换成指定方向上的 PBU值。 因为所有窗口在打开时都有居中问题,所以可以使用全局函数解决这个问题, 以便在应用中的所有窗口都可以调用该函数。该函数的脚本如下: /- /功能:将窗口移到屏幕的中央 /参数:aw_window 要处理的窗口 /返回值:(none) /调用举例:gf_window_center(w_pay_mode) /- Environment le_env integer li_iscreenHeight,li_screenWidth long ll_posx,ll_posy GetEnvironment(le_env) li_screenHeight = PixelsToUnits(le_env.screenHeight,YPixelsToUnits!) li_screenWidth = PixelsToUnits(le_env.screenWidth,XPixelsToUnits!) if aw_window.width li_screenWidth then ll_posx = 1 else ll_posy = (li_screenWidth - aw_window.width)/2 end if if aw_window.height li_screenHeight then ll_posy = 1 else ll_posy = (li_screenHeight - aw_window.Height)/2 end if aw_window.Move(ll_posx,ll_posy) 上面的脚本用函数 GetEnvironment获取当前的环境信息,并将其成员变量 ScreenWidth和 ScreenHeight转换成 PBU值,然后减去当前窗口的宽(高), 取差值的 1/2即为窗口居中时的起始坐标。 有时窗口的位置要恢复到用户上次使用时的情况,可以借助于 ini文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 乐理初级考试题及答案
- 课件显示全屏快捷键
- 课件时间显示问题
- 冷却筛分工培训考核试卷及答案
- 酒类分级考试题及答案
- 2025年教师招聘之《幼儿教师招聘》通关试题库及答案详解(历年真题)
- 教师招聘之《幼儿教师招聘》通关考试题库附参考答案详解(研优卷)
- 甘油水处理工质量管控考核试卷及答案
- 金箔制作工突发故障应对考核试卷及答案
- 采购员设备调试考核试卷及答案
- 龙虎山正一日诵早晚课
- 米粉及杂粮类制品课件
- 楔形平板产生的等厚干涉
- 骨髓腔穿刺在急诊急救中的应用课件
- 机械动力学PPT完整全套教学课件
- 年产2.03万吨高端精细化学品及5G新材料项目环评报告书
- 群众文化副高答辩问题及答案
- GB/T 41972-2022铸铁件铸造缺陷分类及命名
- 主编-孙晓岭组织行为学-课件
- 中医刮痧法诊疗操作评分标准
- 《师范生教师职业能力证书》样式及说明
评论
0/150
提交评论