王朝网络
分享
 
 
 

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

王朝other·作者佚名  2006-01-31
宽屏版  字体: |||超大  

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:cuixuf@chinarapid.com)

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

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:cuixuf@chinarapid.com)

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

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

case 1

for j = 1 to UpperBound(ls_level2_1)

// uo_1.uf_addtool( /*integer id*/, /*string name*/, /*string caption*/, /*integer cposition*/, /*string category*/, /*integer controltype*/, /*string picture*/, /*integer toolstyle*/, /*string tagvariant */)

lobj_tool = uo_1.uf_addtool( wf_getuniqueID(ii_UniqueID), ls_level2_1[j], ls_level2_1[j], ddCPBelow, ls_level1[i], ddTTButton, "find.ico", ddSIconText, ls_level2_1[j])

uo_1.uf_inserttool( lobj_childband, ii_UniqueID )

next

case 2

for j = 1 to UpperBound(ls_level2_2)

lobj_tool = uo_1.uf_addtool( wf_getuniqueID(ii_UniqueID), ls_level2_2[j], ls_level2_2[j], ddCPBelow, ls_level1[j], ddTTButton, "find.ico", ddSIconText, ls_level2_2[j])

uo_1.uf_inserttool( lobj_childband, ii_UniqueID )

next

case 3

for j = 1 to UpperBound(ls_level2_3)

lobj_tool = uo_1.uf_addtool( wf_getuniqueID(ii_UniqueID), ls_level2_3[j], ls_level2_3[j], ddCPBelow, ls_level1[j], ddTTButton, "find.ico", ddSIconText, ls_level2_3[j])

uo_1.uf_inserttool( lobj_childband, ii_UniqueID )

next

case else

end choose

next

//Resize u_ActiveBar

uo_1.uf_resize( this.workspacewidth( ) - 10 , this.workspaceheight( ) , mdi_1 )

uo_1.uf_resize( this.workspacewidth( ) , this.workspaceheight( ) , mdi_1 )

为了在w_frame变化窗口大小时ActiveBar及MDI窗口能随之变化,w_frame的RESIZE事件中写:uo_1.uf_resize( newwidth,newheight,mdi_1)

接下来,我们可以写一个函数f_menu,放在ActiveBar的toolclick事件里,我封装在u_ActiveBar的ue_toolclick上,根据ActiveBar的tool tag来进行不同的工作。

这样,一个用ACTIVEBAR动态创建Outlook的小例子就差不多完工了。我们在实际应用中,可以在数据库中建表存储MENU对应的模块ID号、模块名称、窗口名称、ICON图标等等信息,结合动态生成MENU的方法(关于动态生成MENU,可以参照汽球的BLOG,嘻嘻),用户通过自己的权限将获得不同的模块,从而动态生成属于不同用户的Outlook框架。

这是我第一次写东东,要特别感谢杨小宝做的取Picture字段的OCX。另外,如果有说得不清楚的地方或者需要讨论的事宜,请与我联系:) MAIL:cuixuf@sina.com,QQ:21417511。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有