窗口与控件
窗口与控件专题所涉及的范围比较广,如特殊功能控件的实现,友好漂亮界面的制作,
这些都是PB程序员比较感兴趣的话题。在PowerBuilder中,如果善于运用数据窗口与API技术,开发出的应用定将与众不同。本章结合实例介绍如下专题:
制作Splash窗口
制作美观的状态条
系统热键的实现
创建图标栏应用
MDI窗口显示背景图片
定制有特色的图标按钮
导航图界面的制作
制作图文并茂的菜单
窗口内控件大小与窗口大小同步
动态创建控件
控件融合技术
窗口中控件显示ToolTips
第章
1
PowerBuilder 8.0进阶篇
·2·
owerBuilder 编程离不开窗口与控件,从某种程度上可以说,现在的可视化编程无非就是将各种控件垒加到窗口中,再加上编写的一些代码,就构成了一个应用程序。因此可以这么理解:窗口与控件是可视化编程的基础。PowerBuilder 8.0提供了类型丰富的窗口及控件,灵活使用它们可以为应用开发提供极大的方便。
很多人认为,PowerBuilder 在界面制作方面功能不是很强,很难制作出Delphi 那样的漂亮界面。其实只要肯思考,善于利用数据窗口及API 等技术,PowerBuilder 一样可以制作出美观、友好的用户界面。
本章将结合实例介绍在PowerBuilder 中如何制作Splash 启动窗口、美观的状态条、图文并茂的菜单以及如何使用系统热键、创建图标栏、用MDI 窗口显示背景图片、定制按钮、制作导航图界面、使窗口内控件大小与窗口大小同步、动态创建控件、使用控件融合、用窗口中控件显示ToolTips 等实用技术。
1.1 制作Splash 窗口
现在很多商业软件如PowerBuilder 、Word 、金山词霸等都会在程序启动时呈现一个Splash 窗口,窗口上有软件名称、版本、图标等相关信息或“正在加载,请稍候…”等提示信息,该窗口显示一段时间后会自动关闭。如果在自己开发的系统中启动时也加上一个Splash 窗口,虽然不会改善程序性能,但会使应用程序添色不少。
下面介绍在PowerBuilder 中如何实现启动时的Splash 窗口。实例创建步骤如下:
(1) 创建Splash 窗口。选择工具栏中的New 图标,弹出New 对话框,选择PB Object 标签页,再选择Window 新建一个窗口。
(2) 设置Splash 窗口的属性。其中窗口类型设为Popup!,Visible 属性、Enabled 属性和Center (居中)属性设为True ,其他属性都设为False 。属性设置如图1-1所示。
(3)
在Splash 窗口放置相关控件以显示信息如图标、软件名称、版本和公司名称等,可根据软件需要加以选择。最后以“w_Splash ”名称保存该窗口。
P
图1-1 Splash 窗口属性设置
=====================================================================
窗口在5秒钟后接收到Timer事件,关闭w_Splash窗口。在w_Splash的Timer 事件中加入:
Close(this)//关闭窗口
在窗口的Close事件中关闭Timer事件:
Timer(0,this)
(5) 为了测试,另外创建一个菜单m_main和一个mdihelp!类型的窗口w_main,并将菜单m_main关联至w_main窗口。w_main作为系统的主窗口。
(6) 调用Splash窗口。程序启动时调用Splash窗口,并连接数据库,最后打开系统主窗口。在Application的Open事件加入如下脚本:
===================================================================== //调用Splash窗口
Open(w_splash)
//连接数据库
// Profile EAS Demo DB V4
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=EAS Demo DB V4;UID=dba;PWD=sql'"
Connect;
If sqlca.sqlcode <> 0 then
Messagebox('连接数据库失败',sqlca.sqlerrtext)
Halt
Else
//打开系统主窗口
Open(w_main)
End If
=====================================================================
1.2 制作美观的状态条
一个程序的微帮助状态栏常用于显示该系统的一些重要信息或帮助信息,其重要性是
PowerBuilder 8.0进阶篇
·4·
不言而喻的。但PowerBuilder中的微帮助状态栏一直不尽如人意,单一并且不能定制,甚至连字体属性都不能修改,因此有必要自己创建状态栏,使之更加美观、漂亮。下面通过实例给出两种定制状态条的方法。
1.2.1 利用Popup窗口
这种方法的原理是利用一个Popup!类型的窗口来放置状态栏的有关信息,如操作员、系统时间等,并将此窗口显示在MDI窗口状态栏合适的位置。这里给出一个在MDI窗口右下角实时显示系统时间的简单例子,运行效果如图1-2所示。
图1-2 状态栏右边显示系统时间
实例创建步骤如下:
(1) 创建一个Popup!类型的窗口w_popup_time,并将其Visible属性、Enabled属性设置为True,其他属性都设为False。窗口大小、位置设置:X:0,Y:0,Width:230,Height:52。
(2) 在w_popup_time中放置两个控件:
sle_time:单行编辑器,用于显示系统时间。将Border的属性设为False,BorderStyle 设为StyleBox!。
st_1:静态文本框,用于分隔状态栏。将Border的属性设为True,BorderStyle设为StyleRaised!。
(3) 在w_pouup_time窗口的如下事件中编写脚本。
Open事件
===================================================================== //显示时间
sle_time.text = string(now(),"hh:mm:ss")
Timer (1)
//设置分隔文本的大小、位置
st_1.Move (5, 0)
st_1.Resize (16, this.Height)
=====================================================================
===================================================================== //声明窗口
w_Popup_Time iw_Popup_Time
=====================================================================
(5) 在w_main窗口的如下事件中编写脚本:
Open事件
===================================================================== long ll_wx,ll_wy,ll_wh,ll_ww
ll_wx = this.workspacex ( )
ll_wy = this.workspacey ( )
ll_wh = this.workspaceheight ( )
ll_ww = this.workspacewidth ( )
open(iw_popup_time)
//设定位置
iw_popup_time.move(ll_wx + ll_ww - iw_popup_time.width - 100 , &
ll_wy + ll_wh - iw_popup_time.height - 6)
===================================================================== Resize事件
===================================================================== integer ll_wx ,ll_wy ,ll_wh ,ll_ww
ll_wx =this.workspacex ( )
ll_wy =this.workspacey ( )
ll_wh =this.workspaceheight ( )
ll_ww =this.workspacewidth ( )
//MDI窗口改变大小时,iw_popup_time的位置要随之改变
if IsValid (iw_popup_time) then
iw_popup_time.move(ll_wx +ll_ww - iw_popup_time.width - 100,&
ll_wy +ll_wh - iw_popup_time.height - 6 ) end if
=====================================================================
PowerBuilder 8.0进阶篇
·6·
Ue_move事件(用户自定义事件,Event ID:pbm_move)
MDI窗口移动时,iw_popup_time的位置要随之改变,并保持与MDI窗口的相对位置不变。脚本同Resize事件。
1.2.2 利用窗口内控件
利用窗口内控件制作状态条的原理很简单,就是在运行过程中保持该控件与窗口的相对位置不变,并把相关信息显示在该控件中。
本例利用数据窗口控件来显示状态栏信息。
(1) 创建一个Tabular风格,数据源为External的数据窗口d_status_bar。各列定义参见表1-1。
表1-1 d_status_bar 定义
(2) 为数据窗口对象d_status_bar增加位图及线条等控件,如图1-3所示。这样做的目的是使定制的状态条更加美观。
图1-3 设计数据窗口d_status_bar
其中,在sysdate字段的后面增加一个计算域week,用来根据日期显示星期。计算域的表达式为:
===================================================================== case( daynumber(sysdate ) when 1 then '星期天' when 2 then '星期一' when 3 then '星期二' when 4 then '星期三' when 5 then '星期四' when 6 then '星期五' when 7 then '星期六' else '')
===================================================================== 计算域的文本字体(Text Color)设置为:
case (daynumber(sysdate) when 1 then 255 when 7 then 255 else 0)
Open事件
===================================================================== //显示状态栏信息
dw_status_bar.Insertrow(0)
dw_status_bar.Setitem(1,'department', '部门:PowerBuilder编程俱乐部')
dw_status_bar.Setitem(1, 'user',' 柜员:柯建勋' )
dw_status_bar.Setitem(1, 'sysdate',now())
//dw_status_bar.Setitem(1, 'other',' 其他信息' )
dw_status_bar.Object.DataWindow.ReadOnly = True
===================================================================== Resize事件
===================================================================== integer li_height,li_width
//状态栏
li_height = this.workspaceHeight()
li_width = this.workspaceWidth()
mdi_1.x = this.workspacex()
mdi_1.y = this.workspacey() - 4
mdi_1.height = li_height - dw_status_bar.height + 8
mdi_1.width = li_width
//定位
dw_status_bar.x = this.workspacex() - 4
dw_status_bar.y = mdi_1.y + mdi_1.height
dw_status_bar.width = li_width + 4
=====================================================================
(6) 此状态条的运行效果如图1-4所示。
本例中,在数据窗口对象d_status_bar定制了“部门”、“柜员”、“日期”和“其他信息”四个栏目,在实际应用中可以根据需要来进行扩展、灵活掌握。
不过上面两种方法虽然可以定义出非常漂亮的工具栏,但都不能算严格意义上的可定
PowerBuilder 8.0进阶篇
·8·
制状态条,可定制状态条应该是可以在程序中定制和扩展的,请参考第5章“用户对象”的第5.1.3节所给出的实现方法。
图1-4 运行效果
1.3 系统热键的实现
在不少大型应用软件中,用户可以通过使用Ctrl+Alt+F2之类的组合键来方便地进行功能切换和处理,加快用户的操作速度;或者在一些软件中,需要在非本软件窗口中实现热键响应功能,如在很多屏幕捕捉软件中使用热键快速捉图。下面给出在PowerBuilder中系统热键的实现方法。
Windows中系统热键的实现方法首先通过调用API函数RegisterHotKey()为窗口注册热键,当热键按下后,Windows会发送消息给窗口,这时可以在窗口的other事件中处理。关于API应用将在第6章“外部函数和Windows API应用”中详细讲解。
具体步骤如下:
(1) 新建一个窗口w_hotkey并定义窗口实例变量:
===================================================================== long atomid
Constant integer MOD_ALT = 1 //Alt键
Constant integer MOD_CONTROL = 2 //Ctrl键
Constant integer MOD_SHIFT = 4 //Shift键
=====================================================================
(2) 声明API函数:
===================================================================== FUNCTION Integer GlobalAddAtom(ref string lpString) LIBRARY "kernel32.dll"
string ls_atomid
ls_atomid = 'myatomid'
atomid = GlobalAddAtom(ls_atomid)
//得到ID,保证不和其他应用程序发生冲突
ll_RC = RegisterHotKey(Handle(this), atomid, MOD_ALT + MOD_CONTROL, 65) //注册的热键为Ctrl+Alt+A ,65为'A'
If ll_RC = 0 then //热键注册冲突
Messagebox("Error!","热键注册错误")
End if
=====================================================================
(4) 在窗口w_hotkey的other事件中编写脚本:
===================================================================== //处理系统热键
IF wparam = atomid THEN
//处理…
MessageBox('hello','你好!')
END IF
=====================================================================
1.4 实现图标栏应用
图标栏应用是目前应用比较广泛的一种技术,系统运行后,在Windows操作系统的图标栏中显示该应用程序的图标,当双击图标时弹出相应的窗口,就像金山词霸、某些杀毒监控软件或PowerBuilder 8.0自带的Adaptive Server Anywhere 7.0数据库启动后一样。下面以一个实例来介绍在PowerBuilder中如何实现图标栏应用。
1.4.1 实例运行效果
启动程序时自动加载图标到Windows图标栏,当鼠标移至图标上时,显示提示信
PowerBuilder 8.0进阶篇
·10·
息,如系统名字等,如图1-5所示。
图1-5 图标栏应用
双击应用栏图标,显示系统主窗口,并更换不同图标,以表示已打开主窗口,如图1-6所示。
右击应用栏图标,弹出功能菜单,如图1-7所示。此时选择不同菜单项,可启动不同功能项。
图
标
更
换
图1-6 双击应用栏图标,显示系统主窗口图1-7 右键菜单
1.4.2 实例创建步骤
(1) 准备资源文件。在创建程序前,先准备两个用于在图标栏中显示的图标文件(.ICO),本例中选用了sysicon1.ico和sysicon2.ico。
(2) 建立一个应用程序对象及Main!类型的窗口w_systray。
(3) 创建结构str_notifyicondata,结构定义如图1-8所示。
图1-8 结构str_notifyicondata
(4) 声明全局外部函数:
===================================================================== Public Function Integer Shell_NotifyIcon (Long dwMessage, Any lpData) Library
PB 840呼吸机介绍 PB 840呼吸机(新生儿全功能型) PB-840TM 新生儿-成人呼吸机是PB公司最新21世纪的机型,它是高科技与临床需求的完美结合。 独有的呼气灵敏度调节,智能的报警系统。 独家专利的主动呼气阀和标准的后备电池使PB-840新生儿-成人呼吸机更适应监护病房处理呼吸问题所需的要求。 顶尖的气路设计,减低吸气做功。在与其它呼吸机的比较中,触发时间时最短的,能够很好的做到与病人的同步性。 独有的理想体重设置(IBW)可防止不适当的呼吸机设置用于病人。输入理想体重后,呼吸机自动调用默认设定和报警限度,有利于进行快速设置并能作相应调整,有利于新医生快速掌握设置。在急症收治病人也能方便设置。 采用彩色(TFT)DualView双屏幕触摸屏,分别显示监护数据和呼吸机设置数据,使操作者一目了然,能快速判断病人情况而给予处理。而其他同类的呼吸机只是单屏显示,在设置时会带来不便。 独有的彩色显示,分别用不同颜色显示自主吸气、机械吸气和呼气,有利于临床观察。SmartAlarm智能报警系统提供优先等级报警,“紧急报警”,“次紧急报警”,“相关报警”分别用红,黄,绿颜色表示。并同时显示报警原因及建议解决方法,以便高效的处理报警情况。独家专利的主动呼气阀,防止过冲压力并可在吸气相实现主动性呼气,使呼吸机更易于病人合拍。 可调的呼吸灵敏度,可补偿呼气时的漏气,并可使呼吸机更适应病人的需求。 独有的吸气端和呼气端的细菌过滤器,能够做到完善的 保护病人,避免病人之间、医患之间的交叉感染。且细菌过滤器可以反复消毒使用,降低后期成本。而别的呼吸机多只有一个吸气端细菌过滤器,容易造成交叉感染,且别的品牌为一次性使用。 独有的晶体热膜式流量传感器,非耗品,经久耐用;而别的品牌呼吸机或是压差式流量传感器,是耗品,要定期更换,增加后期成本;或是热丝式,易坏,增加后期成本。 对呼吸回路的顺应性和阻力或泄漏自动进行补偿,所有呼出气容量均进行BTPS校正,保证通气更为灵敏和精确。 R/VT浅快呼吸指数的监测,对于患者拔管前的判断很有帮助。 Bi-Level(双水平正压通气)模式,使病人通气更方便,满足临床治疗的需要 功能特点 1.用户界面方便直观,双触摸屏幕显示,使用更方便。 2.临床操作简洁,自动计算结果,独有的理想 体重设置(IBW)可防止不适当的呼吸机设置用于病人。 3.拥有多种通气模式可以进行选择。 4.独有的彩色显示,有利于临床观察。 5.多档可调灵敏度,更适应病人的需求。 6.独有的细菌过滤器,避免病人之间、 医患之间的交叉感染。
PB840呼吸机操作流程 1.概述 PB84呼吸机是ICU常用的仪器,操作方便,简单,为护理人员正确使用该呼吸机,保证患者得到安全、正确、有效的治疗而制定本流程。 2.使用方法 操作流程要点说明
操作流程要点说明 接下页
操作流程要点说明
3.快速自检(SST) 呼吸机每使用15天或更换呼吸回路、湿化器、过滤器时必须进行SST实验,用来测量呼吸回路顺应性,检查呼气过滤器阻力,以确保呼吸机准确性。 3.1每项自检存在以下三种结果 SST测试结果意义行动 PASSED测试均通过无,除非呼吸机有所要求 ALERT 测试结果不理想,但不严 重 SST终止 按下其中一键,然后按ACCEPT键确认 RESTART SST(重新SST):指重做SST自检 REPEAT(重复):指重做本单项测试 NEXT(下一步):跳至下一步测试 FAILURE 测试未通过,SST无法完 成,除非设备排除故障 按下其中一键,然后按ACCEPT键确认 RESTART SST(重新SST):指重做SST自检 REPEAT(重复):指重做本单项测试 3.2SST全部测试结果 SST测试结果意义行动 PASSED所有单项测试均通过按以下两项中一项 正常通气,RESTART SST(重新开始SST)按ACCEPT键重做SST自检 RESTART SST(重新开始SST): 按ACCEPT 键重做SST自检 ALERT 自检检测到错误,如十分肯 定错误不会,对患者造成损 害,可忽略而照常使用呼吸 机对患者造成损害,可忽略 而照常使用呼吸机 按以下两项中一项 RESTART SST(重新开始SST): 按ACCEPT 键重做SST自检 OVER RIDE(跳过):按ACCEPT键忽略 ALERT,视作测试通过处理,依次按EXIT SST 、 ACCEPT键呼吸机正常通气状态 FAILURE 自检检测到严重错误, 呼 吸机无法正常通气,不能用 于患者,需要维修 检查或更换回路按下以下键: RESTART SST(重新开始SST):按ACCEPT 键重做SST 自检,如还是失败联系维修