上一篇 | 下一篇

用Virtools SDK+VC++6.0来写Buliding Blocks的方法

发布: 2007-1-25 07:56 | 作者: media | 来源: 奥古多媒体 | 查看: 1792次

用Virtools SDK+VC++6.0来写Buliding Blocks的方法
1A-V/a6~%rV
Q4czmgK
-m4L|m?H(|F 使用Virtools的朋友都知道,Building Blocks是很重要的.在VT中提供了几百个BB供我们来使用.使用Virtools的SDK,我们可以开发出自己需要的Buliding Blocks,利用它很容易对我们的Virtools供能进行扩展.奥古多媒体.a!C(G9c'[

H)w ^(Q'vb*~ }E z 在这里我写一篇教程,来介绍一下用Virtools SDK和VC++6.0来写Building Blocks的过程和方法. 奥古多媒体 j6F#Eka
奥古多媒体a E7E@ A!sqy8Qx
这里要用到一些Win32和API编程的方法,不会的赶快恶补一下了,否则看不懂可别怪我.
{!dpdh(M
#ql+B(^.M(~5j 在这个实例中,我们要开发一个这样的Building Blocks.它可以完成以下三个功能:奥古多媒体C;d4fR@L.m^
奥古多媒体-i1V4RC*T z
1: 可以把当前系统的时间以不同格式在Virtools中显示;奥古多媒体+ctv1gB_
2: 它可以是你的Building Blocks对应的主窗口永远处于最上层;
NSp!{;] c1p La0u J 3: 通过关闭进程的方法,它可以关闭你想要关闭程序和进程.
kQ9_m-et6c
_'K} ye q0bj.~ 要先完成准备工作,在SDK中提供给我们了一个开发Building Blocks的向导文件Virtools Behaviors AppWizard.awx,位于\SDK\Utils\目录下.你把它拷贝到你的\Microsoft Visual Studio\Common\MSDev98\Template目录下.奥古多媒体Lr*E\ ry [

];LjK2ZUs 完成以后启动的VC++,执行File-->New...,在Project中可以看到Virtools BB新建这一项,选中它.奥古多媒体5|_A.O%i3M[

s}/vZ"W6Je8PI!| 在Project Name中填入你的名称,比如"My Building Blocks",同时要设置好你的项目保存路径.如图,单击OK进入下一步.
E5kfI-A
x5N8d*j:s]
Nkd Uq$C 奥古多媒体,y'GhRS*C&`)AE2}
勾选"Behavior"和"Manager"这两个选项.
c WTh0a0`c0bV
&dQfG3EMe!X 说明: 开发Buliding Blocks,"Behavior"选项一定要选择的,否则不能继续了.奥古多媒体R c zf:{W
奥古多媒体/lm5dE8b!o Ib
由于我们在这个实例中要用到Enum类型变量,也就是枚举类型的变量.在Behavior中要用到你自己声明的新类型变量,必须要在CKERROR InitInstance(CKContext* context)接口中先注册,才能使用.所以我们要用到ParameterManager,必须勾选"Manager"这一项。按下Next,继续。
9iA_s8ZB5`:t:T
3f VKz ^
i`$N R~^Q
Czl9SJ 在这个窗口中填入你的Buliding Blocks的名字,要注意,这个名字不要和你的先前Project名字相同,否则编译时会报错。实现的类名称,我们不错修改,Next,继续。
A(z e`i,_'Y
sen L5[T,`Q Y
.H@m[i'_mOP2M
8Ai/Q+f8d+hP-_x r 在这个窗口中,我们在Behavior栏目中输入你的BB的类别名称“MyBBs”描述中填入你的描述“Show time Set Windows Always Top Exit Your proceeding” 为了简化我们Code,在Behavior Flags中我们不作勾选,需要的时侯我们自己加上代码来实现。这个实例中我们不用到Behavior的回调函数,所以CallBacks也不选择。Next,继续奥古多媒体T Tg1w1]0E
奥古多媒体*xw5hw|'N

dioGWU5U 奥古多媒体7}W:ZHa/hZ
填入你的Manager的名字,其他的选项不作勾选。Next,继续。
qAWS*c(y LG
'd%@ q T z/}J
o t0t/\"k.Ey\
P a5BNg%sS
Q~gQ^hJg 在这个窗口设置你的SDK目录和VT程序目录,插件名称等。单击Finish,完成。
+VI!g4Z$i(P 奥古多媒体loBV2ix
奥古多媒体9OOx&s1T:t
执行Build--->Rebuild all。即可生成你的Buliding Blocks,它已经自动编译到你的Virtools\BuildingBlocks目录中。你启动你的Virtools,在Buliding Blocks列表中可以看到MyBBs这一项,里边已经有了我们编写的Time_Top_Exit BB了,如下图所示。
nI?$\xL*w.VE8q9n 奥古多媒体;XW"K(i je

\6}*tRk/w m 奥古多媒体)[;b c9Amwt4_$g

3c a/a0S[ Ga 在你的项目文件中可以看到一些接口函数。
czi2D py%m 奥古多媒体Nw-qqAL
我们先声明一个枚举变量,然后注册它。用它来做我们的Time Type下拉列表(4个选项)。打开你的MyBB.h文件,在顶部加入以下Code:
9V+J;lHx:`l+_\4P%e Nl typedef enum SHOWTIMETYPENUM
q!}@AV4k~L {奥古多媒体8w!h1p3X*a
OSTIME =0x00000000, //24小时显示时间奥古多媒体(nm%|/FE!Z:ZN9{4eLI!_
OSDATE =0x00000001, //显示当前日期奥古多媒体!M;Kk R-b
UNIX_TIME_AND_DATE= 0x00000002,//完整显示日期,时间奥古多媒体5ya%Z v,YF.K3E
HOUR_TIME_12= 0x00000003,//以12小时方式显示奥古多媒体(r-W1l I0Mt1R6v
}Enumeration;
,n8]I!al o
Q Rzw,j4bG1\ E)Cb 这里有四个枚举值。
z`M A8Qv:| 奥古多媒体`S%] ?6T#som$~V`
然后用define宏来设置这个变量:
U(h*upe #define GUID_SHOWTIMETYPENUM MyBBGUID奥古多媒体f)u5s0z;P;n

q Up A8RA6BN!K$@ 在CKERROR InitInstance(CKContext* context)接口中加入注册新类型变量的Code:奥古多媒体/r)B Nxw
奥古多媒体]3G1xb3a S aY
CKParameterManager* pm = context->GetParameterManager();奥古多媒体K2lG2O C*\.A
pm->RegisterNewEnum(GUID_SHOWTIMETYPENUM,"SHOWTIMETYPENUM","OSTIME =0x00000000,OSDATE =0x00000001,UNIX_TIME_AND_DATE= 0x00000002,HOUR_TIME_12= 0x00000003");奥古多媒体0l+Ub |\o4G8@
//注册新的变量类型。接口原型请参见SDK。奥古多媒体 N.cH[h'~
奥古多媒体9G)_N:c.X
pm->ChangeEnumDeclaration(GUID_SHOWTIMETYPENUM,"OSTIME,OSDATE,UNIX_TIME_AND_DATE,HOUR_TIME_12");
?$B%j)B7b$`n //设置可以枚举的变量范围奥古多媒体s1o&dM*m{-[2R

B%E2j:_~)dPF&b
X6Z0fN`L6n
&f1E6d#Pb-_Z 找到你的CKERROR CreateTime_Top_ExitProto(CKBehaviorPrototype** pproto)接口函数:在这里进行InPut,Out,InputParameter和OutParameter等参数的声明.奥古多媒体T4ViA+grC
这两行代码保留:
_q0Y] IPE2g v
)G$A MB&Be;GEE? proto->DeclareInput("In0");奥古多媒体5Pn&Vv,B?p6_
proto->DeclareOutput("Out0");奥古多媒体&vNWm,A6~
奥古多媒体;f(d*o&P8W
在他的下边加入我们的LoopIn和LoopOut声明
+g+oL;Xr QQAS
` j/u'D0?h proto->DeclareInput("LoopIn");
wSJ/nee^xU*| proto->DeclareOutput("LoopOut"); 奥古多媒体,q*Bl*b8EE f

3EC;}-i IVy? 奥古多媒体9z(htfU2O5H
还是在这个接口函数中,我们把奥古多媒体P[~@8skYxh
proto->DeclareInParameter("InP0",CKPGUID_INT);
,f7Zy"MBr,?(w proto->DeclareOutParameter("OutP0",CKPGUID_INT);奥古多媒体F`V,s/?~d#V
这两行注释掉奥古多媒体.s(Vl hB0v H _.v"T F
加入我们的输入参数列表Code,并且初始化它:
t E'?&u:f AOz proto->DeclareInParameter("Show Time Type",GUID_SHOWTIMETYPENUM,"OSTIME");奥古多媒体c7T8{|xm g
//第一个型参,是一个enum类型的,以下拉List来实现用户的选择
X0['[XXd&v proto->DeclareInParameter("window always top?",CKPGUID_BOOL,"FALSE");奥古多媒体(q7y"])Q~W
//第二个型参,布尔类型.用户勾选则执行window always top奥古多媒体 gA5vdw2w U}
proto->DeclareInParameter("Exit Virtools?",CKPGUID_BOOL,"FALSE");奥古多媒体W+r'Fo+y$H2W$q9e I}
//第三个型参,布尔类型.用户勾选则执行Exit Virtools.
kZ3gXCVO3f 奥古多媒体V5t oC Jm!sGEm
填加实现BB的输出参数Code:
*[(E;e7W5z&X#eD(c proto->DeclareOutParameter("Out Time String",CKPGUID_STRING);
*I m:V'h J t2G //输出一个字符串奥古多媒体er7d b]

R5Y ?"N+l4U TB 在这个文件的顶部包入头文件,加入这行Code:
(Wg|'gd;Ne,@"H2g0P8a #include "MyBB.h"奥古多媒体(kL.O@ R
现在你可以编译的DLL,应该编译通过.
)d+V'S1Z u&` 打开你的Virtools Dev,把我们刚编写的Show_Top_Exit,放到你的Level Script,编辑他的参数列表,应该如图所示 奥古多媒体&[n8s0y$?+P T!fa
奥古多媒体&xxRR6{D*PI'mZ

k!x"SkG4lm7D*Dx 奥古多媒体}Vg_:HIHt

/S%Z^h*H(zX~ 在int Time_Top_Exit(const CKBehaviorContext& BehContext)接口中来实现我们要完成的功能:奥古多媒体2S(cx+n;A }{GC

6v9nPI2ru~VqB-L 在这个文件顶部加入Code,来实现包含API和Time头文件
wq0YuL P O"EF;F 奥古多媒体]^hb:oQ
#include "windows.h"奥古多媒体8\ifw!dK%m&rm]F
#include "time.h"
(Vr8xJ L
q_:y'Iy 加入这三行Code,初始化BB:
w p)]!E5L6[z[1]"f
;e&E|.ar G/d@:~ CKBehavior *beh = BehContext.Behavior;//取得BB的上下文举柄奥古多媒体P&@,ar#O+h}V_if
beh->ActivateInput(0,FALSE);//奥古多媒体6`$sMf(}&xv
beh->ActivateOutput(0);//初始化输入输出流状态
q(~7@;J8`a'W!gqFO 奥古多媒体 P,~'Y;YL
完成第一个功能:
{/Y%iCCk^ N L8~9I 奥古多媒体-JbDtAL$T
声明我们要用到的表述时间的变量:奥古多媒体PdqF(B$l1Te

S3c|#~^| char tmpbuf[128], ampm[] = "AM";
N4GD,a*Zg char *tempstr=NULL;奥古多媒体!c+f:ON%w(y3zRt
struct tm *today,*newtime;奥古多媒体+uC,z*X1{
long lTime;奥古多媒体{3H`3V U(b-y8I

zh i*eqzK~X&Q 刷新当前的时间环境变量:
4c3LYB*l LB!Q 奥古多媒体#Ha ^#r%sF
_tzset();
(IYh.J+Q"G4\M 奥古多媒体WS2N3|jYR}Y
根据Loop的状态来设置相应的输入输出状态:
"Y z1y g&s*o'Xw
].Y$j @D8d9o'Mk q+o if( beh->IsInputActive(0) )
iX'^ ?+B;]$I"}#z { 奥古多媒体 Y.|+i(wa)^
beh->ActivateInput(0,FALSE);
a&sf3\Q-BC }奥古多媒体1[(x p#i-T0L/av
else {奥古多媒体!P^+n U| A*oUH
beh->ActivateInput(1,FALSE);奥古多媒体z[ n.H c7rWr0b
beh->GetOutputParameterValue(0,&elapsedTime);
*W,m4l;Y0@]j9w }奥古多媒体'm`-w9j(|!EP2}
奥古多媒体0_6Tu.aV)T;Y:{
声明我们要用到的枚举值,取得当前用户选择的ID
fgGXi4?cZ
k yP+^*GW-^$o SHOWTIMETYPENUM type;奥古多媒体(l^I+lD ab\&gL
beh->GetInputParameterValue(0,&type);奥古多媒体*A7c0~4XhP(zd

$_k R~`P%|.M @%R 根据枚举值,进行判断:
[ex#O@m 奥古多媒体;D"L2MbZ7SR
switch(type)奥古多媒体Gl qf9?6G
{奥古多媒体0i oTPIL
case OSTIME:
8~W"uG,g _strtime(tmpbuf);奥古多媒体)Y|!u,bg2N&X
break;
MF!]\^y4K,h%e E case OSDATE:奥古多媒体,V9d@r:J g0UoI
_strdate(tmpbuf);
1D'WA-O v break;奥古多媒体g pnj!L Hcf A
case UNIX_TIME_AND_DATE:奥古多媒体%PXW5eU8B%e6N5J
time(&lTime);
cn/y1WZL-l8l newtime=localtime(&lTime);奥古多媒体2Ki[R t$V&W+p
strcpy(tmpbuf,asctime(newtime));奥古多媒体u?$HE)S^n_/]4S
tmpbuf[24]=' ';奥古多媒体NV Kv qZx%o,_
tmpbuf[25]=0;
Z Yl:M?S break;
^lA!YsD4r case HOUR_TIME_12:
P#z0g`sn time(&lTime);奥古多媒体 V(\0nq$G,g
today = localtime( &lTime);
q$J3B4[x:p if( today->tm_hour > 12 )
Wbh y;eL/t {
$L9`7Dq'cg$g&LE strcpy( ampm, "PM" );
7yI CZ3g8s F|e today->tm_hour -= 12;奥古多媒体\hAATe9RUbD
}
U u\Z6` j/]-g if( today->tm_hour == 0 ) today->tm_hour = 12;奥古多媒体$Z6t)}in
sprintf(tmpbuf,"\t\t\t\t%.8s %s",asctime(today)+11,ampm); break;奥古多媒体(C0Oq;]/U&\
}奥古多媒体_%\*Q"c'a0m
奥古多媒体*L~ a m"Q"VC,J+p5U0?
输出字符串到我们的第一个输出参数中并激活循环:奥古多媒体To:?!{7FV!H

U`"[/IJ beh->SetOutputParameterValue(0,tmpbuf);奥古多媒体 |Y~u,?,Z_O
beh->ActivateOutput(1,TRUE);
(lk1xIQeX 奥古多媒体K3]y,L0s!^8P)_#XZ
到现在位置,我们的第一个功能已经实现了.编译你的Dll,在Virtools中进行测试: 奥古多媒体/N}1M2E/`X
奥古多媒体9F|(Kq+bMO
奥古多媒体"@*Q&N'| ]V
奥古多媒体ln| @ J

g9h/e7x*x)| }7\ [[ 另外两个功能的实现,现在对你来说,是不是也不难实现了?自己动手试试吧,有问题请到论坛提出来
;^+W%RjS4K9bN http://www.aougu.net/bbs
$ra%B^\]-_
`7eK0a-Z!Dj3L J 请到论坛下载相关例子:http://www.aougu.net/bbs/index.php?...id=28772&page=2

字号: | 推荐给好友

 

评分:0

我来说两句

seccode


音乐
落叶 画心 放生 天亮了 牡丹江 那滋味 擦肩而过 怀念过去 北京欢迎你 突然好想你 吻的太逼真 说好的幸福呢 坐上火车去拉萨 如果爱能早些说出来
愚爱 心碎 稻香 带我走 醉赤壁 魔杰座 我还想她 为你而活 一定要爱你 等爱的玫瑰 原谅我一次 越单纯越幸福 最后一次的温柔 给我一首歌的时间
白狐 光荣 火花 下雨天 小酒窝 樱花草 为你写诗 无可取代 无情的温柔 寂寞才说爱 忘不掉的伤 爱上你是个错 陪你一起看草原 地球人都知道我爱你
城府 假如 花海 兰亭序 爱太痛 舍不得 你若成风 女人如烟 外滩十八号 我们的纪念 摇滚怎么了 和寂寞说分手 爱上你是我的错 爱情里没有谁对谁错