---- 用于生成具有Office 97风格的菜单和工具条的ActiveBar控件1.0版,早以以其强大的功能,可方便地生成自定义的菜单及工具条,而广受程序员们的青睐。但是它却不能支持PowerBuilder,不免给PowerBuilder程序员带来了遗憾,新出版的ActiveBar 2.0版,不仅在功能上大大超过了ActiveBar 1.0版(它可设计出具有Office 2000 的各种程序界面,包括菜单、工具栏、垂直导航、状态栏以及各种 Dock 窗口),而且它可支持VB5.0或更高版本、VC5.0或更高版本、IE4.0或更高版本、Delphi4.0或更高版本、HTML编辑器,虽然它的帮助文件未提及支持PowerBuilder,但是经过笔者测试,在PowerBuilder 6.0、6.5、7.0版本(其它版本未测试)中可以使用它,下面就介绍如何在PowerBuilder中使用ActiveBar2.0版控件,同样也适用于其它编程语言。
---- 安装完ActiveBar控件后,在PowerBuilder的窗口中选择添加OLE对象,从Insert Control列表框中选取ActiveBar2 Class控件,添加到窗口后,用鼠标选取它并点右键,从弹出式菜单中选择Ocx Properties…进入ActiveBar Designer,它是用于交互设计工具条、菜单等的工具,其功能强大,能轻易设计出所需要的工具条、菜单等项。
---- 在Designer中,ActiveBar有两个分支,一个是Categories(类别)用于创建Tool对象,并将所创建的Tool对象进行分门别类的管理,另一个是Bands,用于放置按钮、菜单项的工具条、菜单条等的集合,以下步骤用于创建一个具有菜单条、工具栏、状态栏、垂直导航的界面。
---- 一、在Categories中新增如下5个类别:
---- ①Shortcuts(用于垂直导航),在其中增加如下5个Button(按钮),tInternet(name = tInternet,caption = Internet,Description = Internet,tooltip text = Internet)、tExplorer(name = tExplorer, caption = Explorer, Description = Explorer,tooltip text = Explorer)、tNetwork(name = tNetwork,caption = Network,Description = Network,tooltip text = Network)、tMycomputer(name = tMycomputer,caption = My Computer,Description = My Computer,tooltip text = My Computer)、tRecycle(name = tRecycle,caption = Recycle,Description = Recycle、tooltip text = Recycle);
---- ②StatusBar(用于状态栏),在其中增加如下7个Label,status(name = status,caption = 准备…,Alignment = 3,style = 0,Autosize = 1,LabelBlvel = 2,LabelStyle = 0)、statusInsert(name = statusInsert,caption = Ins,Alignment = 4,style = 1,Autosize = 0,LabelBlvel = 2,LabelStyle = 1)、statusCaps(name = statusCaps,caption = Caps Lock,Alignment = 4,style = 1,Autosize = 0,LabelBlvel = 2,LabelStyle = 2)、statusNum(name = statusNum,caption = Num Lock,Alignment = 4,style = 1,Autosize = 0,LabelBlvel = 2,LabelStyle = 3)、statusScroll(name = statusScroll,caption = Scroll Lock,Alignment = 4,style = 1,Autosize = 0,LabelBlvel = 2,LabelStyle = 4)、statusTime(name = statusTime,caption = 22:16,Alignment = 4,style = 1,Autosize = 0,LabelBlvel = 2,LabelStyle = 6)、statusDate(name = statusDate,caption = 00-2-16,Alignment = 4,style = 1,Autosize = 0,LabelBlvel = 2,LabelStyle = 5);
---- ③edit(用于菜单及工具栏),在其中增加如下对象,undo(name = undo,caption = 撤消(&U),controltype = 0,tooltip text = 撤消)、tsep(name = tsep,caption 为空,controltype = 5)、cut(name = cut,caption = 剪切(&T),controltype = 0,tooltip text = 剪切);
---- ④file(用于菜单及工具栏),在其中增加4个Button按钮,newfile(name = newfile,caption = 新建(&N))、tsep1(name = tsep1,caption 为空,controltype = 5)、openfile(name = openfile,caption = 打开(&O))、savefile(name = savefile,caption = 保存(&S))、tsep2(name = tsep2,caption 为空,controltype = 5)、exit(name = exit,caption = 退出(&X));
---- ⑤menu(用于菜单),在其中增加2个Button按钮,file(name = file,caption = 文件(&F))、edit(name = edit,caption = 编辑(&E));
---- 二、在Bands中创建如下对象
---- ①popfile(弹出式菜单(Popup Menu),用于菜单下的菜单项,在ActiveBar中,所有展开的菜单都是弹出式菜单),将Categories中的file类下的所有对象逐一添加到此弹出式菜单。
---- ②popedit(弹出式菜单(Popup Menu),用于菜单下的菜单项),将Categories中的edit类下的所有对象逐一添加到此弹出式菜单。
---- ③menu(菜单(Menu Bar),用于菜单),将Categories中的menu类下的所有对象逐一添加到此菜单。将两个按钮的SubBand属性分别设置为popfile和popedit。
---- ④StatusBar(状态栏(Status Bar),用于状态栏),将Categories中的StatusBar类下的所有对象逐一添加到此状态栏。
---- ⑤ToolBar(工具栏(Tool Bar),用于工具栏),将Categories中的file类下的按钮newfile、openfile、savefile和edit类下的按钮undo和cut添加到此工具栏。并在savefile后添加edit类下的tsep分格栏,将cut按钮的controltype属性改为1(下拉式按钮)、subband = popfile。
---- ⑥tbShortcuts(工具栏(Tool Bar),用于垂直导航),name = tbShortcuts、caption =快捷方式、DockingArea = 2、ChildBandStyle = 3以产生一个Child Bands,在此Child Bands下增加一个Band,name = tbMyShortcuts,caption = 快捷按钮,然后将Categories中的Shortcuts类下的所有对象逐一添加到此栏。
---- 以上如有用到图片的地方如工具栏、垂直导航等,请自行指定其Bitmap属性。上述步骤完成了设计阶段的任务,下面介绍在PowerBuilder中如何调用它。
---- 在窗口中放置一个ActiveBar控件(name = ole_1),按上述步骤完成设计阶段的任务。在窗口的open事件中写如下代码:
This.WindowState = Maximized! //窗口最大化ole_1.x = 0ole_1.y = 0在窗口的resize事件中写如下代码:ole_1.width = this.widthole_1.height = this.height - 100在ole_1的toolclick事件中写如下代码:CHOOSE CASE Tool.Name CASE 'newfile' messagebox('','创建一个文件') CASE 'openfile' messagebox('','打开一个文件') CASE 'savefile' messagebox('','保存一个文件') CASE 'exit' close(parent)END CHOOSE---- 运行程序,可以产生一个具有office 2000风格的菜单条、工具栏、状态栏、垂直导航的界面。
---- 用上述方法生成的菜单和工具条等信息全部存在程序中(*.pbl),也可以不用在编程语言中设计,而在ActiveBar安装路径下单独运行Designer可执行程序,设计完后将其保存为脚本文件(*.tb2),在程序中调用它,调用格式如下:
[form!]ActiveBar2.Load BandName As String,vData As Variant, SerializeOptions As Long
---- 如果不指定Band名则会把脚本中的所有Band全部载入。如果只载入某几个Band,则需一个个地依次载入。使用这种方法,当用户通过"自定义"菜单改变了菜单、工具条等后,能使程序通过保存脚本的方式来保存当前的工具条和菜单等信息。下次运行程序时再载入,使程序保持用户自定义的界面。
---- 保存脚本的格式如下:
[form!]ActiveBar2.Save BandName As String,FileName As String, SerializeOptions As Long如果没有指定Band名,则保存所有的Band。
---- 举例如下:
---- 在窗口的open事件中写如下代码:
This.WindowState = Maximized! //窗口最大化ole_1.x = 0ole_1.y = 0ole_1.object.load('','c:\temp\1\activebar.tb2',1)//载入脚本文件If FileExists("c:\temp\UserChanges.tb2") Then ole_1.object.LoadLayoutChanges("c:\temp\UserChanges.tb2",1)End IfIf FileExists("c:\temp\MenuUsage.tb2") Thenole_1.object.LoadMenuUsageData("c:\temp\MenuUsage.tb2",1)End Ifole_1.object.RecalcLayout()//重新排布窗口中的各种Band对象
在窗口的resize事件中写如下代码:ole_1.width = this.widthole_1.height = this.height - 100
在窗口的close事件中写如下代码:ole_1.object.SaveMenuUsageData("c:\temp\MenuUsage.tb2", 1)
在ole_1的customizeend事件中写如下代码:If bModified Then this.object.SaveLayoutChanges("c:\temp\UserChanges.tb2", 1)End If
在ole_1的toolclick事件中写如下代码:CHOOSE CASE Tool.Name CASE 'newfile' messagebox('','创建一个文件') CASE 'openfile' messagebox('','打开一个文件') CASE 'savefile' messagebox('','保存一个文件') CASE 'exit' close(parent)END CHOOSE---- 以上两种方法都可生成菜单、工具条等对象,但是它们都是在设计时就产生的,ActiveBar2.0版支持程序运行时生成菜单,详细情况请见ActiveBar的帮助或者用户手册,这些资料对所有属性、方法和事件都有详尽的说明。
---- Designer可以打开脚本文件,同时也可打开ActiveBar1.0版脚本文件(*.tb),使得前后版本兼容,同时也可在多种编程语言中共享脚本文件,为程序开发节省了时间。经测试ActiveBar2.0对PowerBuilder6.5版本支持不是很好,多次修改后发现不能存盘,解决此问题的一个方法是用Designer先设计好所需的菜单、工具条、状态栏等对象,然后在程序中用Ocx Properties…将其添加到程序中,另一个解决方法是用PowerBuilder7.0版本设计程序,ActiveBar2.0较好地支持了它。
---- ActiveBar2.0版可在http://www.nease.net/~jackyyin/index_main.htm中下载,希望它能帮你设计出良好的界面。