PB窗口使用技巧之增强窗口显示效果

一、窗口最小化时设置动态图标

二、放置闪烁文字

三、提高窗口的打开速度

四、移动不带标题栏的窗口

五、闪烁窗口标题栏

六、给窗口添加自动滚动条功能

窗口是应用程序中一个非常重要的界面,界面设计的大部分工作体现在窗口界面的设计中。所以,在不影响功能的前提下,提倡给用户提供更有提示性的、更美观的界面。常用的手段是动画、声音等,下面介绍这些常用的方法。

一、窗口最小化时设置动态图标

当应用程序最小化时,程序的图标如果是动画的,肯定更能吸引用户的注意,视觉效果会更好。方法是通过动态修改程序的图标来实现。

当程序最小化时打开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事件。

三、提高窗口的打开速度

在窗口的Open事件中经常编写脚本来进行初始处理工作,如果这些工作花费的时间比较长,在窗口显示之前用户就得等待很长的时间。友好的界面应该马上显示窗口界面,然后让用户等待,并且设置鼠标形状表示当前正在进行处理,以免用户焦急。可以使用用户自定义事件和PostEvent函数来解决这个问题。比如,下面是一个检索大量数据的窗口编程:

在窗口中定义自定义事件ue_openpost(映射PowerBuilder的任意一个CusTom事件),在窗口的Open事件中编写如下脚本:

PostEvent("ue_openpost")

然后在窗口的自定义事件ue_openpost中编写如下脚本:

SetPoInter(HourGlass!)

dw_1.SetTransObject(SQLCA)

dw_1.Retrieve()

SetPoInter(Arrow!)

使用函数PostEvent和TriggerEvent都可以触发其他的事件,但是两者是有区别的。PostEvent触发的事件不是马上执行,而TriggerEvent触发的事件马上执行。PostEvent向消息队列中发送消息,等当前脚本执行完毕再触发消息队列中等待状态事件的脚本;而TriggerEvent函数可以中断当前执行的脚本,转向被触发事件,等执行完被触发事件的脚本后再返回到当前脚本继续执行。所以,当需要马上执行被触发的事件时使用函数TriggerEvent;当执行完当前脚本后需要触发某个事件时使用函数PostEvent。但是,当在脚本最后触发其他事件时不论使用哪个函数,效果都相同。例如,上面例子中可以在窗口的Open事件中用下面脚本替换:

TriggerEvent("ue_openpost")

为了进一步提高窗口打开的速度,可以在数据窗口检索数据之前禁止数据窗口刷新。在窗口的Open事件中编写如下脚本:

dw_1.SetRedraw(False)

TriggerEvent("ue_openpost")

Dw_1.SetRedraw(True)

在窗口的自定义事件ue_openpost中,脚本不变。这时,上面的函数就不能用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 < i_Width Then //如果小于打开时的宽度

This.HscrollBar = 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 If

This.HscrollBar = 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 Then //如果用户滚动了垂直滚动条且不需再显示

Post(hwindow,277,6,0) //则垂直调整窗口中的内容到原来的位置

End If

This.VscrollBar = False //取消滚动条特性

End If

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值