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
图2
正如笔者在《用 Windows 公共控件增强 PB 应用的界面》中所说的,状态条控件不必调用 InitCommonControls( )、CreateWindowsEx( ) 和 ShowWindow( ) 函数。因此修改上述的属性后,状态条控件即显示出来了。将该用户对象命名为 ctrl_status_bar,并将继承自该用户对象的用户对象 ctrl_sbar 布置于 w_frame 上。
动态调整大小
当调整父窗口的大小时,需要相应调整状态条和 MDIClient 的大小,在父窗口的 resize 事件中,修改控件的宽及 MDIClient 的坐标和长宽:
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 的大小,故需要进行调整:
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
一般在 Powerbuilder 中发送消息要用 Send( ) 函数,但 SB_SETPARTS 消息的参数为:
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( ) 为: