上一篇 | 下一篇

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

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

用Virtools SDK+VC++6.0来写Buliding Blocks的方法
R8T v-y Hr1e5BAD 奥古多媒体QH x.QAi)y ^
奥古多媒体K){'w5Z;G3T+f*`y i
使用Virtools的朋友都知道,Building Blocks是很重要的.在VT中提供了几百个BB供我们来使用.使用Virtools的SDK,我们可以开发出自己需要的Buliding Blocks,利用它很容易对我们的Virtools供能进行扩展.奥古多媒体8z+~ K]s)s

{,sO[o;_ U 在这里我写一篇教程,来介绍一下用Virtools SDK和VC++6.0来写Building Blocks的过程和方法.
SNj6wv7I"r9qK'J` M
onE0K&RctL 这里要用到一些Win32和API编程的方法,不会的赶快恶补一下了,否则看不懂可别怪我. 奥古多媒体9D6[ \r(`/S!~Y9u%t
奥古多媒体 H#~Y z:@|9\S&}
在这个实例中,我们要开发一个这样的Building Blocks.它可以完成以下三个功能:
OHH$q q)F1_[.F 奥古多媒体!Nz{qT
1: 可以把当前系统的时间以不同格式在Virtools中显示;
h9D%X.`yg~%G(x"x 2: 它可以是你的Building Blocks对应的主窗口永远处于最上层;
Q*LQ;Fl3{l 3: 通过关闭进程的方法,它可以关闭你想要关闭程序和进程.
R:P#g [J'c
mm7~X'? [D;`i}'C 要先完成准备工作,在SDK中提供给我们了一个开发Building Blocks的向导文件Virtools Behaviors AppWizard.awx,位于\SDK\Utils\目录下.你把它拷贝到你的\Microsoft Visual Studio\Common\MSDev98\Template目录下.
0`~2G Jcxx
E8hy'B1\ 完成以后启动的VC++,执行File-->New...,在Project中可以看到Virtools BB新建这一项,选中它.
:tfr+k[ NH0k 奥古多媒体 i`(fl0j6D4ay
在Project Name中填入你的名称,比如"My Building Blocks",同时要设置好你的项目保存路径.如图,单击OK进入下一步.奥古多媒体uWWM+lWRts

5Dh&B,P Tn
x`C"{ g8yN3FB
5[(|JoZ?,~[ 勾选"Behavior"和"Manager"这两个选项.奥古多媒体B4?0|lT+a y5i
奥古多媒体#R)fh!Wyl,wP
说明: 开发Buliding Blocks,"Behavior"选项一定要选择的,否则不能继续了.奥古多媒体Mu X3Z3^ i8lH%uI C"P
奥古多媒体 ]9fU.C1\5n u3P&v K;u L
由于我们在这个实例中要用到Enum类型变量,也就是枚举类型的变量.在Behavior中要用到你自己声明的新类型变量,必须要在CKERROR InitInstance(CKContext* context)接口中先注册,才能使用.所以我们要用到ParameterManager,必须勾选"Manager"这一项。按下Next,继续。奥古多媒体I:`m,GMx#t k
奥古多媒体 }Q L }+W&[.X7z

Ts-B1s8^zG A 奥古多媒体&@ U,Y,{f
在这个窗口中填入你的Buliding Blocks的名字,要注意,这个名字不要和你的先前Project名字相同,否则编译时会报错。实现的类名称,我们不错修改,Next,继续。
-q"p.{Ib0h'UZ;A/fU
`GP0e3I/@p
Y)\6jFo.c I 奥古多媒体X#a"Q"p(JYB Z%J
在这个窗口中,我们在Behavior栏目中输入你的BB的类别名称“MyBBs”描述中填入你的描述“Show time Set Windows Always Top Exit Your proceeding” 为了简化我们Code,在Behavior Flags中我们不作勾选,需要的时侯我们自己加上代码来实现。这个实例中我们不用到Behavior的回调函数,所以CallBacks也不选择。Next,继续
q*IVrH QD9B7\
a0Co]Aa 奥古多媒体P%e]0C&n'p6fK^k

N1E;P8SY$[ 填入你的Manager的名字,其他的选项不作勾选。Next,继续。
2^;W6~/MF} 奥古多媒体 \&jwm%BX;p

KPk~%gNn_nCw 奥古多媒体6Q#Oe;WH^
奥古多媒体V BqCr%v xoj
在这个窗口设置你的SDK目录和VT程序目录,插件名称等。单击Finish,完成。
0X I]V8|2PlsY.C o/rM 奥古多媒体#s!X;S:eL+~
奥古多媒体2B9Czz@L
执行Build--->Rebuild all。即可生成你的Buliding Blocks,它已经自动编译到你的Virtools\BuildingBlocks目录中。你启动你的Virtools,在Buliding Blocks列表中可以看到MyBBs这一项,里边已经有了我们编写的Time_Top_Exit BB了,如下图所示。奥古多媒体6P)t o'yX"F V4Hf
奥古多媒体l)Bm+h csOa~r

2}^ jbmd%hxOx R7J
@R5J%o^
Xf @3Q!Dk$mgo 在你的项目文件中可以看到一些接口函数。奥古多媒体+X@R(ZcP8~
奥古多媒体eG:T Vy/F
我们先声明一个枚举变量,然后注册它。用它来做我们的Time Type下拉列表(4个选项)。打开你的MyBB.h文件,在顶部加入以下Code:奥古多媒体8Ht\fi?
typedef enum SHOWTIMETYPENUM
"\'z.pZn1dV| {奥古多媒体5l!C6nUGW
OSTIME =0x00000000, //24小时显示时间奥古多媒体 \9? m2{J}ay%V3d~x
OSDATE =0x00000001, //显示当前日期
NS9F8K|:d%o&m UNIX_TIME_AND_DATE= 0x00000002,//完整显示日期,时间奥古多媒体t g ^e3V _3i;S
HOUR_TIME_12= 0x00000003,//以12小时方式显示
b:@y2p2u5N }Enumeration;
B%b^]c0_@1I 奥古多媒体$RYr6G?V7}s Z
这里有四个枚举值。奥古多媒体GSaD-O!F
奥古多媒体1],oDW7T#r4y
然后用define宏来设置这个变量:
3V)I4bq.R;h }(L8g| #define GUID_SHOWTIMETYPENUM MyBBGUID奥古多媒体 u[1E0H4}#Cx&f}
奥古多媒体O[&\+Ri+ru6r:c
在CKERROR InitInstance(CKContext* context)接口中加入注册新类型变量的Code:
hY*Tj DGW!l
ge%F!e YTB CKParameterManager* pm = context->GetParameterManager();
%IZZhB$U%K pm->RegisterNewEnum(GUID_SHOWTIMETYPENUM,"SHOWTIMETYPENUM","OSTIME =0x00000000,OSDATE =0x00000001,UNIX_TIME_AND_DATE= 0x00000002,HOUR_TIME_12= 0x00000003");奥古多媒体N}Jb3s6d9h9jF A-v}
//注册新的变量类型。接口原型请参见SDK。奥古多媒体p@ qq)_*_A(p;p%r
奥古多媒体 T0r@R6ext
pm->ChangeEnumDeclaration(GUID_SHOWTIMETYPENUM,"OSTIME,OSDATE,UNIX_TIME_AND_DATE,HOUR_TIME_12");奥古多媒体)m%l] ? \9Jj)o8]
//设置可以枚举的变量范围奥古多媒体6t!`%p9Y_&pu

(^#@(@"Y5?$v+Q 奥古多媒体vDY6yD!L'Z
奥古多媒体'{/h"_Y+wb ~ t
找到你的CKERROR CreateTime_Top_ExitProto(CKBehaviorPrototype** pproto)接口函数:在这里进行InPut,Out,InputParameter和OutParameter等参数的声明.
'|9ktu9~] 这两行代码保留:奥古多媒体w:JYX!ni2T#g
奥古多媒体dQOwS t
proto->DeclareInput("In0");奥古多媒体(z!ttk(TO%|
proto->DeclareOutput("Out0");
4U:Z1U]wm {eT 奥古多媒体 q8zL8@K3w n@
在他的下边加入我们的LoopIn和LoopOut声明
!VxN-h'Q
!G1ap-r$z proto->DeclareInput("LoopIn");
!uN-e-\ UNb9B proto->DeclareOutput("LoopOut"); 奥古多媒体&^2o%z"Dlv

q${5VIJ{4G uD;B{
@5?D1Z/_QGa|9Ha 还是在这个接口函数中,我们把奥古多媒体+b$p6~ l!b
proto->DeclareInParameter("InP0",CKPGUID_INT);
C b"j0UT%]`8pO j proto->DeclareOutParameter("OutP0",CKPGUID_INT);奥古多媒体&@1aUP zb1Q T
这两行注释掉
i*bZ7Y*^ 加入我们的输入参数列表Code,并且初始化它:奥古多媒体`/X9[x'yW
proto->DeclareInParameter("Show Time Type",GUID_SHOWTIMETYPENUM,"OSTIME");奥古多媒体7Y"ro6?9Ot-F
//第一个型参,是一个enum类型的,以下拉List来实现用户的选择
XD'LKL7~3t7? proto->DeclareInParameter("window always top?",CKPGUID_BOOL,"FALSE");
'Xcy r W*v ^9N7c //第二个型参,布尔类型.用户勾选则执行window always top奥古多媒体2v j2`H{/Y
proto->DeclareInParameter("Exit Virtools?",CKPGUID_BOOL,"FALSE");
8|M}m0AX ?z //第三个型参,布尔类型.用户勾选则执行Exit Virtools.
Gj,AEjK
MF_2@u t 填加实现BB的输出参数Code:奥古多媒体})}3Vg X"J5E+r(H*ap
proto->DeclareOutParameter("Out Time String",CKPGUID_STRING);
9?,lVmYd2V^6m //输出一个字符串奥古多媒体;w(pYtw0q

&waW0rw3n4tT 在这个文件的顶部包入头文件,加入这行Code:
,fF^L-G*IZ #include "MyBB.h"
't \g5Om i-Oe-r2v 现在你可以编译的DLL,应该编译通过.奥古多媒体{.b?f@*E6^:[{J
打开你的Virtools Dev,把我们刚编写的Show_Top_Exit,放到你的Level Script,编辑他的参数列表,应该如图所示
XS#T/__ 奥古多媒体*^8z*qj:K3~&G;|
奥古多媒体5q$mef:r*IM

v| pS:R1Ji+q 奥古多媒体/[ yAWj w%uqs\
在int Time_Top_Exit(const CKBehaviorContext& BehContext)接口中来实现我们要完成的功能:
4nI*{TX
2V(W3n#dE5r5F 在这个文件顶部加入Code,来实现包含API和Time头文件奥古多媒体/c$g,A3`(i;d_"tz.r
奥古多媒体:zG5S? b5Fe a
#include "windows.h"奥古多媒体H\`9y7zR5H`~ rz
#include "time.h"
FH!n+d-P/t 奥古多媒体C/P-] N6ck%}
加入这三行Code,初始化BB:
+Lqg"gzN8k T1hXR+e 奥古多媒体(r&| c@8Q(z2Un
CKBehavior *beh = BehContext.Behavior;//取得BB的上下文举柄
UB+rp0c!ai beh->ActivateInput(0,FALSE);//
#zI/Kwa beh->ActivateOutput(0);//初始化输入输出流状态
a.C-u g9|-F+P\_
&r4^6{4S'o X+g 完成第一个功能:奥古多媒体}v*Wm v:T _4Q
奥古多媒体])cmy8P&R h
声明我们要用到的表述时间的变量:
#C,K})Hr,Y|4d_ t 奥古多媒体8~ l9N$Q7q.Kx/x s0M*F
char tmpbuf[128], ampm[] = "AM";
oXZYJ,[ char *tempstr=NULL;奥古多媒体h.jW(e%\*KOi,CU
struct tm *today,*newtime;奥古多媒体VyP*D.]
long lTime;奥古多媒体y#}n2B/_e$c

HK~G'}@:j 刷新当前的时间环境变量:
C%]} Fjl H 奥古多媒体XD}bv8Oajg
_tzset();奥古多媒体3] M&k~!wR q-f4L
奥古多媒体-Ntz ~Z;D
根据Loop的状态来设置相应的输入输出状态:
w8AsM/_ p%a 奥古多媒体6Y3oS,a GxH
if( beh->IsInputActive(0) )奥古多媒体?ML)U)aYfo
{ 奥古多媒体!Kl%ne4p9q'B!@^#y
beh->ActivateInput(0,FALSE);奥古多媒体 x U Lv7d-}4d8ny
}奥古多媒体OR M$Mha*w0r_
else {奥古多媒体7I|3vk F? C
beh->ActivateInput(1,FALSE);
0GBU:[yP beh->GetOutputParameterValue(0,&elapsedTime);奥古多媒体K7^!wieI
}
7j5r!@j@r[
IZ'OX;G 声明我们要用到的枚举值,取得当前用户选择的ID
"IYk5T-Os A
K3[|b0?2K3B e SHOWTIMETYPENUM type;
x0m9].z[^E beh->GetInputParameterValue(0,&type);奥古多媒体gc.V3X1S%nY7i9w
奥古多媒体G z.E `'{
根据枚举值,进行判断:奥古多媒体 ^`0}#B O

8n[ g dku%UC&W switch(type)
Jx/?9?Ry(K {
%i9Q? R3~vj$[ case OSTIME:奥古多媒体3un,puO_~
_strtime(tmpbuf);奥古多媒体{JB({4m9c0_CA
break;奥古多媒体 qe+]r/F%h
case OSDATE:
])]#K Y7B0k@-c _strdate(tmpbuf);
mO6MS-TE break;
rP!UU H-`SK case UNIX_TIME_AND_DATE:奥古多媒体1aB9V{X.i}+W/~
time(&lTime);奥古多媒体 As m7lx
newtime=localtime(&lTime);
'W e|2M'[+K ZawUX(M strcpy(tmpbuf,asctime(newtime));奥古多媒体 [6Q"T r:wf-Zpm
tmpbuf[24]=' ';奥古多媒体c9nLM"Z;[.H@.X
tmpbuf[25]=0;
&B!f Ds#iY4Tl\ break;奥古多媒体;gw%K5l_9d2i/E
case HOUR_TIME_12:
4g-`m]#?M PO6i!~ time(&lTime);奥古多媒体|J#` E'C h7V)~izOH
today = localtime( &lTime);奥古多媒体X,a:N"bk4W{"{
if( today->tm_hour > 12 )奥古多媒体V$g'w K"Q@
{奥古多媒体E`(K.["u/dt;E`%q
strcpy( ampm, "PM" );奥古多媒体`4`Q6y1p9_~
today->tm_hour -= 12;
&RZ A{+w&HVO }
&Q|-D#x5V$K;~+M3eu{cY if( today->tm_hour == 0 ) today->tm_hour = 12;奥古多媒体,q)gr/}2e?2L4n
sprintf(tmpbuf,"\t\t\t\t%.8s %s",asctime(today)+11,ampm); break;奥古多媒体 J8f3a fp!xZin;n
}
)AU1c4N W{$M c2N 奥古多媒体9o-|0g iieJ
输出字符串到我们的第一个输出参数中并激活循环:
|0p {$Ys$g 奥古多媒体Q6{p{w:iG1m1MF
beh->SetOutputParameterValue(0,tmpbuf);
/@sLy%o6X'f1m\GP beh->ActivateOutput(1,TRUE);
{(YmHoI4`!xs `L 奥古多媒体N(W@-Idq1M
到现在位置,我们的第一个功能已经实现了.编译你的Dll,在Virtools中进行测试:
q V%n;Y~ eK|
;Mh+nbP(t$\EP
Xlm k9M
;H,I"iQ `1| 奥古多媒体%ol3?0x/s-m'yL
另外两个功能的实现,现在对你来说,是不是也不难实现了?自己动手试试吧,有问题请到论坛提出来
I\6Om*vLvn] http://www.aougu.net/bbs
r'F(R [A(So#h y 奥古多媒体o#td\1[cuz
请到论坛下载相关例子:http://www.aougu.net/bbs/index.php?...id=28772&page=2

字号: | 推荐给好友

 

评分:0

我来说两句

seccode