【PB】Windows 状态条控件在 PB 中的运用

本文介绍了如何在Powerbuilder中利用Windows的msctls_statusbar32控件,通过设置LibraryName、ClassName和Style属性来创建状态条,并详细讲解了初始化、动态调整大小、简单和多部分状态条的实现、模式切换以及Owner-Drawn窗口部分的绘制。此外,还涉及了处理鼠标点击事件和模拟MicroHelp信息显示的方法。
摘要由CSDN通过智能技术生成

Powerbuilder 所提供的 MDIHelp! 窗口类型带有一个 Sybase 自制的类似状态条的控件(严格说它并非是控件),用户可以通过调用 SetMicroHelp( ) 函数修改该控件的显示文本,即该窗口的标题。但与 Windows 的状态条控件相比,它还是缺少了些重要的功能,因此本文将就如何在 Powerbuilder 中使用 Windows 状态条控件展开讨论。在讨论前笔者假设读者对如何在 Powerbuilder 中使用 Windows 公共控件已有所了解,如果读者不了解的话,可以参考笔者的《用 Windows 公共控件增强 PB 应用的界面》

初始化控件

为演示 Windows 状态条控件的功能,笔者先创建一个类型为 Main 的窗口对象,并命名为 w_frame。然后创建一个外部可视用户对象,将

属性 LibraryName 设为:%System%/ COMCTL32.DLL;

属性 ClassName 设为:msctls_statusbar32;

属性 Style 设为:256。

这里 Style 属性有宏 CCS_TOP 和 SBARS_SIZEGRIP 供组合,CCS_TOP(1) 表示控件将显示在父窗口的顶部而非底部,SBARS_SIZEGRIP(256) 表示控件将显示 Sizing Grip,如图1和图2所示。

图1图1

图2图2

正如笔者在《用 Windows 公共控件增强 PB 应用的界面》中所说的,状态条控件不必调用 InitCommonControls( )、CreateWindowsEx( ) 和 ShowWindow( ) 函数。因此修改上述的属性后,状态条控件即显示出来了。将该用户对象命名为 ctrl_status_bar,并将继承自该用户对象的用户对象 ctrl_sbar 布置于 w_frame 上。

动态调整大小

当调整父窗口的大小时,需要相应调整状态条和 MDIClient 的大小,在父窗口的 resize 事件中,修改控件的宽及 MDIClient 的坐标和长宽:

w_frame.Event Resize(ulong sizetype,  int  newwidth,  int  newheight) returns  long
    stc_rect    lstc_rect
    
    ctrl_sbar.width 
=  newWidth
    GetClientRect(Handle(this), lstc_rect)
    lstc_rect.bottom 
=  PixelsToUnits(lstc_rect.bottom, YPixelsToUnits!)
    mdi_1.y 
=  lstc_rect.bottom  -  WorkSpaceHeight()
    mdi_1.width 
=  WorkSpaceWidth()
    mdi_1.height 
=  WorkSpaceHeight() –  80

同样工具栏的移动会修改 WorkSpace 的大小,故需要进行调整:

w_frame.Event ToolbarMoved() returns  long
    stc_rect lstc_rect

    GetClientRect(Handle(this), lstc_rect)
    lstc_rect.bottom 
=  PixelsToUnits(lstc_rect.bottom, YPixelsToUnits!)
    mdi_1.y 
=  lstc_rect.bottom  -  WorkSpaceHeight()
    mdi_1.width 
=  WorkSpaceWidth()
    mdi_1.height 
=  WorkSpaceHeight() –  80

简单模式状态条

如图1和图2所示的由单一部分构成的状态条称为简单模式状态条,形式与 Powerbuilder 的 MDIHelp! 的状态条极相似,只要修改 Text 属性就可改变状态条的文字。

多部分状态条

多部分状态条由多个部分构成,如图3所示。要实现从缺省的简单模式向多部分状态条的转换,需要向控件发生 SB_SETPARTS 消息。

图3图3

一般在 Powerbuilder 中发送消息要用 Send( ) 函数,但 SB_SETPARTS 消息的参数为:

wParam  =  (WPARAM) nParts;  // 部分数
lParam  =  (LPARAM) (LPINT) aWidths;     // 各部分宽度

aWidths 是一个长整型数组,在此要说明的是 32 位 C 编译器所用的 int 是 32 位的,而 Powerbuilder 中的 int 是 16 位,long 是 32 位,所以说 aWidths 是长整型的数组。

由上可知 aWidths 不能作为 Send( ) 的参数,只能用 SendMessageA( ) Win32 API 函数来实现,考虑函数的多态性,可以声明 Powersoft 原型为:

Function ULong SendMessageA(ULong hWnd,ULong Msg,UInt wParam,ref ULong lParam[]) Library "User32.DLL"

 需要注意的是 wParam 不可以被 Ref 修饰,lParam 的类型必须是 Ulong 或 Long,否则控件将视所发 SB_SETPARTS 为无效消息。

基于面向对象的封装原则,定义对象方法 SetParts( ) 为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值