ActiveBar在PB中动态生成Outlook框架的应用

** ActiveBar ** ** 在 PB ** ** 中动态生成 Outlook ** ** 框架的应用

**

** By …---… (QQ:21417511)

**

一、 ActiveBar 简介:

在 VB 、 VC 或者 Delphi 程序员看来, ActiveBar 是一款设计用户界面必不可少的 ActiveX 控件。使用它可以制作出像 Word 一样的个性化菜单、 “ 自定义 ” 对话框;像 Outlook 的快捷按钮栏;像 CorelDRAW 的入坞式窗口;像 Delphi 的控件选择页面。并且 ActiveBar 使用十分简单,保存设计图和加载设计图都十分简单,只用几个方法即可。

二、 ActiveBar 在 PB 中的应用

很早就有大侠写了《 ActiveBar 控件在 PowerBuilder 中的应用》的文章,类似的介绍我就不多说了,没有看过该文章的可以用 Google 找一下来看看。我着重介绍一下如何用 ActiveBar 动态生成 Outlook 框架。

1、 首先,我们要对 ActiveBar 的对象及其关系有个大体的了解,如下图所示:

2、 接下来,我们来探讨一下如何用 ActiveBar 做 Outlook 框架。

先创建一个 custom visual userobject ,里面添置 ActiveBar OLE 控件 ole_1 ,保存成: u_ActiveBar 。这样做的好处是将 ActiveBar 控件封装成 userobject ,方便以后的调用。当然,我还喜欢在这个 userobject 上放一个 statictext st_1 , Text 是: ActiveBar ,这样我以后调用时就能一目了然啦:) userobject 的 construct 代码如下:

st_1.hide( )

ole_1.x = 0

ole_1.y = 0

this.x = 0

this.y = 0

ole_1.width = this.width

ole_1.height = this.height

目的是让 ole 自动放置到调用窗口的左上方,并且隐藏掉 st_1 。

ActiveBar 提供了大量的属性和方法,我们把这些属性与方法转换到 u_ActiveBar 中,以便以后直接调用。

下面,我们开始扩展 u_ActiveBar 。先把 ActiveBar 中常量定义到 instance 变量,这样就省得每次找帮助来看 1 、 2 、 3… 对应的含义啦,举例如下:

//CaptionPostion

Int ddCPStandard = 0 , &

ddCPLeft = 1 , &

ddCPRight = 2 , &

ddCPAbove = 3 , &

ddCPBelow = 4 , &

ddCPCenter = 5

//ChildBandFont3D

int dd3DNone = 0 , &

dd3DRaisedLight = 1 , &

dd3DRaisedHeavy = 2 , &

dd3DInsetLight = 3 , &

dd3DInsetHeavy = 4

在 PB 中,对于 ActiveBar 的对象 band 及 tool 一律视为 oleobject 。例如我们要写一个函数,目的是让 ActiveBar 可以动态增加一个 Band ,我们可以在 u_ActiveBar 中创建如下函数:

/*------------------------------------------------------------------------------

Function: public u_ActiveBar.uf_Addband

Returns: OLEObject

Parameters: value String name

value String caption

value Integer dockingarea

value Integer grabhandlestyle

Description:

--------------------------------------------------------------------------------

2005-04-12 2.0.0 Initial version by cuixuf (Mail:[email protected])

------------------------------------------------------------------------------*/

oleobject lobj_band

lobj_band = create oleobject

lobj_band = ole_1.object.Bands.Add(name)

lobj_band.Caption = caption

lobj_band.ChildBandStyle = ddCBSSlidingTabs

lobj_band.DockingArea = DockingArea

lobj_band.GrabHandleStyle = GrabHandleStyle

return lobj_band

类似的,我们可以通过 userobject 的函数把 ActiveBar 需要用到的方法和属性集成到一起,在这里我就不多说了。大家可以看一下我做的 u_ActiveBar ,我集成了一些函数,但没有做全,如有人有兴趣的话,可以帮我补全,只是不要忘了发给我一份哦。

不过,不要开心得太早,我们用 ActiveBar 时可能最头痛的地方就是在动态生成 tool 时调用 setpicture 方法。 ActiveBar 中的帮助是这么写的:

[form!]Tool.SetPicture Index As ImageTypes, picture As Picture, [ color As Color ]

PB 中是没有 Picture 类型的,用 Blob 取文件内容再赋值经过测试也不行,但是我们可以想到 VB 中有种数据类型就是 PICTURE ,只好曲线救国,利用 VB 写个 OCX 返回 PICTURE 类型让 PB 调用。 VB 中的 OCX 写法也很简单,如下:

Public Function getPict (ByVal strFileName As String) As Object

Dim X As Picture

Set X = LoadPict (strFileName)

Set getPicture = X

End Function

生成 OCX 后,注册,并添加此 OLE 到 u_ActiveBar 中,名称为 ole_2 ,设为 Invisible 。 u_ActiveBar 中 uf_addtool 函数示例如下:

/*------------------------------------------------------------------------------

Function: public u_ActiveBar.uf_Addtool

Returns: OLEObject

Parameters: value Integer id

value String name

value String caption

value Integer cposition

value String category

value Integer controltype

value String picture

value Integer toolstyle

value String tagvariant

Description:

--------------------------------------------------------------------------------

2005-04-12 2.0.0 Initial version by cuixuf (Mail:[email protected])

------------------------------------------------------------------------------*/

oleobject lobj_tool

lobj_tool = create oleobject

lobj_Tool = ole_1.object.Tools.Add(id, name)

lobj_tool.Caption = caption

lobj_tool.CaptionPosition = cposition

lobj_tool.Category = category

lobj_tool.ControlType = controltype

lobj_tool.Style = toolstyle

lobj_tool.tagVariant = tagvariant

oleobject lobj_pic

lobj_pic = ole_2.object.getpict(picture)

lobj_tool.SetPicture(ddITNormal, lobj_pic )

return lobj_tool

OK ,我们做完 u_ActiveBar 后,现在开始来使用它了。我们做一个用 ActiveBar 设计器做一个 frame.tb2 ,只有一个 status 的 band ,其它的都不做,我们进行动态创建其它的对象。

在 w_frame 的 OPEN 事件里写如下代码:

string ls_level1[]={" 测试 1"," 测试 2"," 测试 3"}, &

ls_level2_1[] = {" 恭喜发财 "," 万事如意 "," 心想事成 "}, &

ls_level2_2[] = {"Hello","World","My God"}, &

ls_level2_3[] = {" 嘻嘻 "," 哈哈 "," 关于 "}

long i, &

j

Oleobject lobj_band, &

lobj_childband, &

lobj_tool

ii_UniqueID = -1

// 状态栏

uo_1.uf_load('',"frame.tb2",1 )

uo_1.uf_setstatuscaption( "Status", "designer", "...---... QQ:21417511" )

uo_1.uf_setstatuscaption( "Status", "operater", " 用户 : cuixuf")

//Outlook

lobj_band = uo_1.uf_addband( "Outlook", " 工具栏 ", ddDALeft, ddGSNone)

uo_1.uf_setfont3d( lobj_band, dd3DInsetLight )

lobj_band.childbands.backcolor = rgb(58,110,165)

lobj_band.childbands.childbandBackGroundStyle = 0 //0:normal,1:gradient,2:picture

lobj_band.childbands.ChildbandCaptionAlignment = 1 //0:left,1:center,2:right

lobj_band.childbands.ForeColor = rgb(0,0,0)

lobj_band.childbands.ToolForeColor = rgb(255,255,255)

uo_1.uf_removeflag( lobj_band, ddBFDockTop)

uo_1.uf_removeflag( lobj_band, ddBFDockBottom)

uo_1.uf_removeflag( lobj_band, ddBFDockRight)

uo_1.uf_removeflag( lobj_band, ddBFFloat)

uo_1.uf_removeflag( lobj_band, ddBFCustomize)

uo_1.uf_removeflag( lobj_band, ddBFHide)

//Add tool

for i = 1 to Upperbound(ls_level1)

lobj_childband = uo_1.uf_addchildband( lobj_band, ls_level1[i], ls_level1[i] )

choose case i

<p class="MsoNormal" style="MARGIN: 0cm 0cm

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus