你的位置:奥古多媒体 >> 资讯 >> 教程 >> Virtools教程 >> 详细内容 在线投稿

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

排行榜 收藏 打印 发给朋友 举报 来源: 奥古多媒体   发布者:media
热度373票  浏览1974次 时间:2007年1月25日 07:56
用Virtools SDK+VC++6.0来写Buliding Blocks的方法奥古多媒体)}aP2n2Vt j6f7|
奥古多媒体[3u@/\ R9dV
奥古多媒体*xK/b n N9@qNq
使用Virtools的朋友都知道,Building Blocks是很重要的.在VT中提供了几百个BB供我们来使用.使用Virtools的SDK,我们可以开发出自己需要的Buliding Blocks,利用它很容易对我们的Virtools供能进行扩展.奥古多媒体:y }F t}h
奥古多媒体"^7s9\3gm JE
在这里我写一篇教程,来介绍一下用Virtools SDK和VC++6.0来写Building Blocks的过程和方法.
3u I5iRb{2F0
v?VcAh0 这里要用到一些Win32和API编程的方法,不会的赶快恶补一下了,否则看不懂可别怪我. 奥古多媒体]/|M.N2Dw8D
奥古多媒体v&N?#o y s v U
在这个实例中,我们要开发一个这样的Building Blocks.它可以完成以下三个功能:奥古多媒体L/@Dw+Yx;[[9c

@'cx [\6y7\;V0 1: 可以把当前系统的时间以不同格式在Virtools中显示;奥古多媒体|4]Foc_b
2: 它可以是你的Building Blocks对应的主窗口永远处于最上层;奥古多媒体UbMt,z6_!e
3: 通过关闭进程的方法,它可以关闭你想要关闭程序和进程.奥古多媒体 U i#]`-B8sd DSb/cj!e3?

!us"F,hV,U A-p0 要先完成准备工作,在SDK中提供给我们了一个开发Building Blocks的向导文件Virtools Behaviors AppWizard.awx,位于\SDK\Utils\目录下.你把它拷贝到你的\Microsoft Visual Studio\Common\MSDev98\Template目录下.
#r KLLz0 奥古多媒体i${7f2teg!Y!y w
完成以后启动的VC++,执行File-->New...,在Project中可以看到Virtools BB新建这一项,选中它.奥古多媒体,k4Dny9M~-F
奥古多媒体+Vo4L;~-{W;R
在Project Name中填入你的名称,比如"My Building Blocks",同时要设置好你的项目保存路径.如图,单击OK进入下一步.奥古多媒体 EVS;s&x

MC}RS-U$S:T0
H1~]G ZK1@D$@~a0 奥古多媒体/^5J-X#Gi+w(\a5D(@z
勾选"Behavior"和"Manager"这两个选项.
g\_S)d4~8n z0
zw7p+I f0 说明: 开发Buliding Blocks,"Behavior"选项一定要选择的,否则不能继续了.奥古多媒体&SOyFrZX
奥古多媒体:Y7vR&? qvp
由于我们在这个实例中要用到Enum类型变量,也就是枚举类型的变量.在Behavior中要用到你自己声明的新类型变量,必须要在CKERROR InitInstance(CKContext* context)接口中先注册,才能使用.所以我们要用到ParameterManager,必须勾选"Manager"这一项。按下Next,继续。奥古多媒体WE Gy5fJ d_

8^mG+Lq/yH(z2Fa5J0 奥古多媒体!G!~YrF0G(o}}l Z
奥古多媒体#Wn ?5wdL6a-s"P"v.r4M
在这个窗口中填入你的Buliding Blocks的名字,要注意,这个名字不要和你的先前Project名字相同,否则编译时会报错。实现的类名称,我们不错修改,Next,继续。
y^ O)Z|*|3BD0
^r4oG-a]+?Y?Naz0
bXy9h&Ilz)r0 奥古多媒体#n$E p atY4p9K
在这个窗口中,我们在Behavior栏目中输入你的BB的类别名称“MyBBs”描述中填入你的描述“Show time Set Windows Always Top Exit Your proceeding” 为了简化我们Code,在Behavior Flags中我们不作勾选,需要的时侯我们自己加上代码来实现。这个实例中我们不用到Behavior的回调函数,所以CallBacks也不选择。Next,继续奥古多媒体;z/FhdA+S/I
奥古多媒体+Ub:a9L5X~

N`3^sqs0
.B&Ib9t JY@"`0 填入你的Manager的名字,其他的选项不作勾选。Next,继续。奥古多媒体7d0nI X~ x

9\]M N4Wf^i0
p w/o[+{7oG5Q0 奥古多媒体)a,r1p1GF f6b

Rl ] {G tIZ m0 在这个窗口设置你的SDK目录和VT程序目录,插件名称等。单击Finish,完成。奥古多媒体_Vi"iu
奥古多媒体"H:Je6hWo6v

wA%E!|+m%aO&r-_"Xbr0 执行Build--->Rebuild all。即可生成你的Buliding Blocks,它已经自动编译到你的Virtools\BuildingBlocks目录中。你启动你的Virtools,在Buliding Blocks列表中可以看到MyBBs这一项,里边已经有了我们编写的Time_Top_Exit BB了,如下图所示。
S[!z)} ?NR.ZL0 奥古多媒体&m,@&g[~1ld

Z:Ux@~?O'[0
+[]'oqm"i-s0
"].\+j FJ6['N-U8r0 在你的项目文件中可以看到一些接口函数。
tR y V'WZY3g0
$\5{"a]Bo z)cR%S0 我们先声明一个枚举变量,然后注册它。用它来做我们的Time Type下拉列表(4个选项)。打开你的MyBB.h文件,在顶部加入以下Code:奥古多媒体!A2XEzKSm
typedef enum SHOWTIMETYPENUM
6[+\5P"g6buI |0 {
Q!to PL/~ X0 OSTIME =0x00000000, //24小时显示时间
F!^lu3V-f0 OSDATE =0x00000001, //显示当前日期奥古多媒体:I3UsAOr2LKv
UNIX_TIME_AND_DATE= 0x00000002,//完整显示日期,时间奥古多媒体0N~Fi,L,^;ID[[
HOUR_TIME_12= 0x00000003,//以12小时方式显示
,t{!|!FOH0 }Enumeration;奥古多媒体3A#y2ZN,`2V.J XJ

gzu@lF]:Ra0~0 这里有四个枚举值。奥古多媒体6BW/I%`1|
奥古多媒体-t ] ]$|@3t
然后用define宏来设置这个变量:
|q @,Ggt0 #define GUID_SHOWTIMETYPENUM MyBBGUID
Ea2NcHg(Y0 奥古多媒体FgM0Nr@(I.TT%P
在CKERROR InitInstance(CKContext* context)接口中加入注册新类型变量的Code:
{T;cF.k6rx0
+v5jvk Ip0 CKParameterManager* pm = context->GetParameterManager();奥古多媒体YJ*w"`d,~nJ/VS1C
pm->RegisterNewEnum(GUID_SHOWTIMETYPENUM,"SHOWTIMETYPENUM","OSTIME =0x00000000,OSDATE =0x00000001,UNIX_TIME_AND_DATE= 0x00000002,HOUR_TIME_12= 0x00000003");
I0NY#PZ,~"gz p(D!T9h0 //注册新的变量类型。接口原型请参见SDK。
_$]9C9Uu,V0
F2g6kH!M&h5`v @;mb0 pm->ChangeEnumDeclaration(GUID_SHOWTIMETYPENUM,"OSTIME,OSDATE,UNIX_TIME_AND_DATE,HOUR_TIME_12");
A4G.L;RTET"W6f0 //设置可以枚举的变量范围奥古多媒体\X r8B(M4\
奥古多媒体3^3r yx_+[

M5N$^6WA d X(o5o~0
A(z[Sj0 找到你的CKERROR CreateTime_Top_ExitProto(CKBehaviorPrototype** pproto)接口函数:在这里进行InPut,Out,InputParameter和OutParameter等参数的声明.
O(y3`5y Y/uy%hS6M0 这两行代码保留:奥古多媒体n%C4Xr"VYo

$E4dqe~ NH0 proto->DeclareInput("In0");
iY`(pv't0 proto->DeclareOutput("Out0");
6K\X:Y`7l~ loA0
xp/ax5}X`0 在他的下边加入我们的LoopIn和LoopOut声明奥古多媒体;Xji Hz:{4{5V g
奥古多媒体fb ZCYMu
proto->DeclareInput("LoopIn"); 奥古多媒体']$V9R2ob&~?;xX;W(F
proto->DeclareOutput("LoopOut");
o?-l,uD Xm0U)M3c0
@/~4iMP V:J.bWGT0
(TI u&W _)I?1V9iv3?5_0 还是在这个接口函数中,我们把奥古多媒体#D\.ob o0]S1x'E~
proto->DeclareInParameter("InP0",CKPGUID_INT);奥古多媒体IT]0l|Ut sn
proto->DeclareOutParameter("OutP0",CKPGUID_INT);奥古多媒体;wcF3\\5h"m
这两行注释掉
4C5L(|9\9z;i0 加入我们的输入参数列表Code,并且初始化它:
!uO'A(sY7Q,O0 proto->DeclareInParameter("Show Time Type",GUID_SHOWTIMETYPENUM,"OSTIME");奥古多媒体T/S??BS!^R'N
//第一个型参,是一个enum类型的,以下拉List来实现用户的选择奥古多媒体9H}k8O%L7AnRS
proto->DeclareInParameter("window always top?",CKPGUID_BOOL,"FALSE");
n%tm)l`m.g0 //第二个型参,布尔类型.用户勾选则执行window always top奥古多媒体 Jx,`s0D
proto->DeclareInParameter("Exit Virtools?",CKPGUID_BOOL,"FALSE");
jA9liLsn`1u0 //第三个型参,布尔类型.用户勾选则执行Exit Virtools.
2UTn0y VG&C)bQ0 奥古多媒体Ld%n \A!t q-q1x/B#@
填加实现BB的输出参数Code:奥古多媒体+g ihJ(MI(A BmV7I
proto->DeclareOutParameter("Out Time String",CKPGUID_STRING);奥古多媒体LZI:q1}$QO U0c9X
//输出一个字符串
K-W!v;@yVP y0 奥古多媒体i)V X5vX:ab
在这个文件的顶部包入头文件,加入这行Code:奥古多媒体}CT&}yo
#include "MyBB.h"
kf-Um#RF Ta7w2Y0 现在你可以编译的DLL,应该编译通过.奥古多媒体.Z'|n4N@ u)h
打开你的Virtools Dev,把我们刚编写的Show_Top_Exit,放到你的Level Script,编辑他的参数列表,应该如图所示 奥古多媒体4E*X9el p(_3h
奥古多媒体,Qh~gC(qS@YI

*v9DGpp6iB/S g0
]4k0~ OUA(^ Z#X0 奥古多媒体 P[*cf+n)uBa#?(jx
在int Time_Top_Exit(const CKBehaviorContext& BehContext)接口中来实现我们要完成的功能:奥古多媒体@5e$I1H4m

$_3v oa3qA0 在这个文件顶部加入Code,来实现包含API和Time头文件
5}&s8Z)WVy0
P)J$Z)?u j!S+^ Fe0 #include "windows.h"奥古多媒体:X j'bc h,A/F5Q&LV;D
#include "time.h"奥古多媒体Uvaddmy:gx x9E?
奥古多媒体5p9Qe9jJ"uawD{
加入这三行Code,初始化BB:
B5Rh+`O$?$fr0
#? A#X*|B%oH&x0 CKBehavior *beh = BehContext.Behavior;//取得BB的上下文举柄奥古多媒体 g0r K(G%~[@
beh->ActivateInput(0,FALSE);//奥古多媒体t,Rq%`"tC_;PU3UP
beh->ActivateOutput(0);//初始化输入输出流状态
e!m2QY#o%YUxs0 奥古多媒体-O4CBuG g/W5p
完成第一个功能:奥古多媒体 `(x.B"Y%K'mT3k

!]8q \&QT5p)zg D0 声明我们要用到的表述时间的变量:
D6B*o_pY^F#qC0
s w e?2n s0 char tmpbuf[128], ampm[] = "AM";
9p b"f5k+Fcf0 char *tempstr=NULL;
q_.jL3h1gJ0 struct tm *today,*newtime;奥古多媒体k.f9_:f8G-ne"r}
long lTime;奥古多媒体 Z B?5f:v9`%~L

xX*[,FN R6Zu!u0 刷新当前的时间环境变量:奥古多媒体${%D&n ^0n
奥古多媒体Llyw"@?"M
_tzset();奥古多媒体6Hr ]^H^0E*@4]4I;c"D
奥古多媒体B/?r5PeLN K(V
根据Loop的状态来设置相应的输入输出状态:奥古多媒体/Q oN O5gYZ5Xv
奥古多媒体 D#xqZh5v
if( beh->IsInputActive(0) )奥古多媒体k,{B$H,X;j;w
{ 奥古多媒体8Wf(g4] \p
beh->ActivateInput(0,FALSE);奥古多媒体 tZ;Gze+t}0IZ*p
}
NE Y\Z-b B0 else {
A0UCB#aB1zsK0 beh->ActivateInput(1,FALSE);
`\ f,] PC[:RW0 beh->GetOutputParameterValue(0,&elapsedTime);
vo6dS:[*~B0 }
:v:q0|0nk0 奥古多媒体U4G+\2C3NB?
声明我们要用到的枚举值,取得当前用户选择的ID奥古多媒体 ~!Hm5n9}pZU0?N
奥古多媒体jn8S9~ dA`:]
SHOWTIMETYPENUM type;
0gj){$HH?m6T0 beh->GetInputParameterValue(0,&type);奥古多媒体&P&kJF;ztH

!l;AV7n+h5r7V0 根据枚举值,进行判断:奥古多媒体 R]^\R C5@1a:R?:u$_

;?;K?+?[C o-X\0 switch(type)奥古多媒体 XB3m0b~RC
{奥古多媒体c+Ch$}4Um
case OSTIME:
D&gU!u HFX1{0n0 _strtime(tmpbuf);
j0y,c'HnbzZs0 break;
*K3G%jo _#]2jz|0 case OSDATE:奥古多媒体P+VvStR8P
_strdate(tmpbuf);
y.|]J5T1]0 break;奥古多媒体n6`(m'n;F#R%n ?
case UNIX_TIME_AND_DATE:
P4_p5V8AG)H)~-q0 time(&lTime);奥古多媒体TnA ~b7rn
newtime=localtime(&lTime);奥古多媒体1@/C{K4z"{eh
strcpy(tmpbuf,asctime(newtime));
'gC+a(Qt+q@0 tmpbuf[24]=' ';
gCV Q;M CT^'[b0 tmpbuf[25]=0;
8j&R;R!QSS@QQV0 break;
I%s#z%aO[LZ9H0 case HOUR_TIME_12:
3F6_[$L:~!Y9FQ&[B0 time(&lTime);
Ls4w7{yE E[0 today = localtime( &lTime);
7F2LL4md3e;K0 if( today->tm_hour > 12 )
(@(UC e ~*_$vD)J"is1Y0 {
-t0v0u9PMM:M8yvF0 strcpy( ampm, "PM" );
&m#U I q w?0P(^ E0 today->tm_hour -= 12;
e%DjB&E1EVGj/D0 }奥古多媒体} w ?7Uf#X)b9l
if( today->tm_hour == 0 ) today->tm_hour = 12;
pw ^1Z&|3b8A^x0 sprintf(tmpbuf,"\t\t\t\t%.8s %s",asctime(today)+11,ampm); break;
8X2|{WF!C(x0 }
/Q.i6tf_F6}`#P0
CwcW6[q.lx0 输出字符串到我们的第一个输出参数中并激活循环:
J0l5qk-u,^0 奥古多媒体}i0Xo&|Z+f#ZO9d
beh->SetOutputParameterValue(0,tmpbuf);奥古多媒体 b1rLD4J
beh->ActivateOutput(1,TRUE);奥古多媒体Y-W| lT ^ O
奥古多媒体g]2QQ2Q;l-o
到现在位置,我们的第一个功能已经实现了.编译你的Dll,在Virtools中进行测试:
9}Y$wXw7I)N!k L(f0
-TH+uaAg`0
c8J.o P$ba8Jzo0
n7r.R?3J3L4|.B0 奥古多媒体 y+fg P8{kt
另外两个功能的实现,现在对你来说,是不是也不难实现了?自己动手试试吧,有问题请到论坛提出来
%o3{;sGa*d0 http://www.aougu.net/bbs奥古多媒体YUk;R5R/D

y,DP*yU,M0 请到论坛下载相关例子:http://www.aougu.net/bbs/index.php?...id=28772&page=2
顶:20 踩:16
对本文中的事件或人物打分:
当前平均分:-0.07 (118次打分)
对本篇资讯内容的质量打分:
当前平均分:-0.11 (118次打分)
【已经有101人表态】
17票
感动
10票
路过
11票
高兴
15票
难过
11票
搞笑
14票
愤怒
14票
无聊
9票
同情
上一篇 下一篇

网络资源


音乐
嫁衣 画心 歌曲 天亮了 青花瓷 那滋味 Nobody 没有如果 不了了之 爱的华尔兹 生生世世爱 i miss you 说好的幸福呢 如果我变成回忆 在心里从此永远有个你
火苗 心碎 稻香 带我走 我知道 爱得起 我叫mt 类似爱情 明天过后 一定要爱你 等爱的玫瑰 原谅我一次 丢了幸福的猪 斯琴高丽的伤心 这一生回忆有你就足够
白狐 偏爱 犯错 下雨天 小酒窝 樱花草 此生不换 分身情人 郎的诱惑 姑娘我爱你 寂寞才说爱 关不上的窗 一个人的浪漫 即使知道要见面 不是因为寂寞才想你
拾忆 王妃 心墙 全是爱 棉花糖 最天使 少女时代 爱丫爱丫 星空物语 我要的飞翔 我们都一样 我叫小沈阳 爱我就跟我走 让我为你唱首歌 爱上你等于爱上了错