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

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

排行榜 收藏 打印 发给朋友 举报 来源: 奥古多媒体   发布者:media
热度167票  浏览1941次 时间:2007年1月25日 07:56
用Virtools SDK+VC++6.0来写Buliding Blocks的方法
T&E$p)}(^8^!b:K0 奥古多媒体X3TuO }R;G%C
奥古多媒体U3F S L i
使用Virtools的朋友都知道,Building Blocks是很重要的.在VT中提供了几百个BB供我们来使用.使用Virtools的SDK,我们可以开发出自己需要的Buliding Blocks,利用它很容易对我们的Virtools供能进行扩展.奥古多媒体+y,a#f(O0N#PA;VHo@E

%FLv0^m1f.@6}K[0 在这里我写一篇教程,来介绍一下用Virtools SDK和VC++6.0来写Building Blocks的过程和方法.
5{\Hf N/M#W)]A+ZM0 奥古多媒体?t/aP8?M
这里要用到一些Win32和API编程的方法,不会的赶快恶补一下了,否则看不懂可别怪我.
"oS0NXv3^&h0
k+n E2\r;B0 在这个实例中,我们要开发一个这样的Building Blocks.它可以完成以下三个功能:
.Fj'd EN^0 奥古多媒体hX F#sI0?+[*n n
1: 可以把当前系统的时间以不同格式在Virtools中显示;
)`3C mB$i&F%K0 2: 它可以是你的Building Blocks对应的主窗口永远处于最上层;
,`Dj U4`J0 3: 通过关闭进程的方法,它可以关闭你想要关闭程序和进程.
4n^"b#AWG7@m0 奥古多媒体%`Mc*Xj
要先完成准备工作,在SDK中提供给我们了一个开发Building Blocks的向导文件Virtools Behaviors AppWizard.awx,位于\SDK\Utils\目录下.你把它拷贝到你的\Microsoft Visual Studio\Common\MSDev98\Template目录下.
|g%^'UJ6p'E0
#d1K9o'bb [ ["QV?M0 完成以后启动的VC++,执行File-->New...,在Project中可以看到Virtools BB新建这一项,选中它.
&Q B;lq,WV0
j}~9I7vI{0 在Project Name中填入你的名称,比如"My Building Blocks",同时要设置好你的项目保存路径.如图,单击OK进入下一步.
? PaM1G:f+A0 奥古多媒体C dh;iskN

C`~+Yr{p0 奥古多媒体;l+MP G4n i$F
勾选"Behavior"和"Manager"这两个选项.奥古多媒体.P(O%lB\

+lYI3QG0Z0 说明: 开发Buliding Blocks,"Behavior"选项一定要选择的,否则不能继续了.
^$e/} GD+N(Z w0
v&Nm?:M0 由于我们在这个实例中要用到Enum类型变量,也就是枚举类型的变量.在Behavior中要用到你自己声明的新类型变量,必须要在CKERROR InitInstance(CKContext* context)接口中先注册,才能使用.所以我们要用到ParameterManager,必须勾选"Manager"这一项。按下Next,继续。
K:XD P&Ika:S0 奥古多媒体vT#}3p`{
奥古多媒体?^"v%`vl]:F,C!Y:p5V

?8C'SpVh5c1b0 在这个窗口中填入你的Buliding Blocks的名字,要注意,这个名字不要和你的先前Project名字相同,否则编译时会报错。实现的类名称,我们不错修改,Next,继续。
,ZxUtLFrHo0 奥古多媒体w(Z9hR(f6M B
奥古多媒体&K8c0D:PN
奥古多媒体N"~ n q.?0A)w!\d
在这个窗口中,我们在Behavior栏目中输入你的BB的类别名称“MyBBs”描述中填入你的描述“Show time Set Windows Always Top Exit Your proceeding” 为了简化我们Code,在Behavior Flags中我们不作勾选,需要的时侯我们自己加上代码来实现。这个实例中我们不用到Behavior的回调函数,所以CallBacks也不选择。Next,继续
fg W$C)A5GIg0
ax4cLzHk-C7Vy0
i)Du'jOI9TO8xz]y)w0
7an#q;Am0 填入你的Manager的名字,其他的选项不作勾选。Next,继续。
:DO'TQ3{/e0
&[ ^_[|"be0ro rrI/`0
!mmJ*?_#F8i0 奥古多媒体S(k~T?]_L9_ g7h

dmR5Xw9`$U0 在这个窗口设置你的SDK目录和VT程序目录,插件名称等。单击Finish,完成。
T8W*al$clB1p8Dhi0
d;J'lqu2yz0
Q%_Pp%i7d0 执行Build--->Rebuild all。即可生成你的Buliding Blocks,它已经自动编译到你的Virtools\BuildingBlocks目录中。你启动你的Virtools,在Buliding Blocks列表中可以看到MyBBs这一项,里边已经有了我们编写的Time_Top_Exit BB了,如下图所示。奥古多媒体 t}cK\$d+o
奥古多媒体3t k md_n+Pl5M%R
奥古多媒体4mP+Q*E O/D
奥古多媒体G-LczY;Xxy#O
奥古多媒体wvWZ,D$oH9u F
在你的项目文件中可以看到一些接口函数。奥古多媒体!ykWi4J&BgV

J Qf;{7|"o\&w0 我们先声明一个枚举变量,然后注册它。用它来做我们的Time Type下拉列表(4个选项)。打开你的MyBB.h文件,在顶部加入以下Code:
Ah0x+Z Lx2j)Yb2Y0 typedef enum SHOWTIMETYPENUM奥古多媒体+Bf3fQpEl
{奥古多媒体;[*mA[.o:O
OSTIME =0x00000000, //24小时显示时间
4SZ*O8K`s~~!A$I0 OSDATE =0x00000001, //显示当前日期奥古多媒体 Ua mL['F;Ey
UNIX_TIME_AND_DATE= 0x00000002,//完整显示日期,时间
/p2@7J!@m(D{q-B?0 HOUR_TIME_12= 0x00000003,//以12小时方式显示奥古多媒体;Uh/Fg0nz6ny
}Enumeration;奥古多媒体R4S"}c/tV Hs t

G*A0Fc RDc0t6j:b,F0 这里有四个枚举值。奥古多媒体I&o3Si3d*dV6P,i
奥古多媒体"PHW1Tk Vu
然后用define宏来设置这个变量:
.JE5{ XB?4e!X0 #define GUID_SHOWTIMETYPENUM MyBBGUID奥古多媒体-L8[n4j {v.e%C*`

;V3[ jV8NSHE0 在CKERROR InitInstance(CKContext* context)接口中加入注册新类型变量的Code:
vLAI/U1z|0
8f2L l5^1g7p2x N0 CKParameterManager* pm = context->GetParameterManager();
+K(M"U9gm?ETW0 pm->RegisterNewEnum(GUID_SHOWTIMETYPENUM,"SHOWTIMETYPENUM","OSTIME =0x00000000,OSDATE =0x00000001,UNIX_TIME_AND_DATE= 0x00000002,HOUR_TIME_12= 0x00000003");奥古多媒体Vc!z'z2X4AT0t y|.d&^
//注册新的变量类型。接口原型请参见SDK。
T S\nN'x0 奥古多媒体S/R.{;_P"c-SQ
pm->ChangeEnumDeclaration(GUID_SHOWTIMETYPENUM,"OSTIME,OSDATE,UNIX_TIME_AND_DATE,HOUR_TIME_12");奥古多媒体#OM$o{/E3``$Y
//设置可以枚举的变量范围
4I a1^R/u0 奥古多媒体 ac5{M,w@(zAPO

0m7KdZc^$S5}8k0
O#w$wd&g0 找到你的CKERROR CreateTime_Top_ExitProto(CKBehaviorPrototype** pproto)接口函数:在这里进行InPut,Out,InputParameter和OutParameter等参数的声明.
7nOf!KhZ0 这两行代码保留:奥古多媒体o&ggK([+Ol+t)H

7_;d)?-Rbx!i$V0 proto->DeclareInput("In0");奥古多媒体5Z+L*O1IAh3p"] T_
proto->DeclareOutput("Out0");
a-p.h3h2I5ai8x?0 奥古多媒体R&KJp `-u3Zk
在他的下边加入我们的LoopIn和LoopOut声明奥古多媒体B v;R*S%W"A

3V hG&ZY,nhv8F}0 proto->DeclareInput("LoopIn"); 奥古多媒体5WNI;]2f#r z#hzQ|
proto->DeclareOutput("LoopOut");
$y'A8B@)[%m0
-e#v6B`%d{+T:nc0
BO jO,K0krvn0 还是在这个接口函数中,我们把
-q`{;P N%j0 proto->DeclareInParameter("InP0",CKPGUID_INT);奥古多媒体4W-p2B }:z)G
proto->DeclareOutParameter("OutP0",CKPGUID_INT);
P8wdMx5K#E5n/X&z0 这两行注释掉
6{y G m~b2}r0 加入我们的输入参数列表Code,并且初始化它:奥古多媒体u;b`2^X `6IQ
proto->DeclareInParameter("Show Time Type",GUID_SHOWTIMETYPENUM,"OSTIME");
0CO9iH;e1]k0 //第一个型参,是一个enum类型的,以下拉List来实现用户的选择奥古多媒体@ F$r$F,Y!F
proto->DeclareInParameter("window always top?",CKPGUID_BOOL,"FALSE");奥古多媒体,C|qIk0W
//第二个型参,布尔类型.用户勾选则执行window always top
]_@y?c0 proto->DeclareInParameter("Exit Virtools?",CKPGUID_BOOL,"FALSE");
(XV/?7M{xX0 //第三个型参,布尔类型.用户勾选则执行Exit Virtools.
"E,[6M'Jo F QH0 奥古多媒体_ueZ8J Yh
填加实现BB的输出参数Code:奥古多媒体 ~Eh`J i(S
proto->DeclareOutParameter("Out Time String",CKPGUID_STRING);奥古多媒体\CY.r_ ey a-{
//输出一个字符串奥古多媒体^M6vxal
奥古多媒体:MFpN9H.bvQ'PR
在这个文件的顶部包入头文件,加入这行Code:奥古多媒体)]:R]/QB6B&yP
#include "MyBB.h"奥古多媒体j3E:] S+UeR/K6L.k)]
现在你可以编译的DLL,应该编译通过.奥古多媒体9a&gC#~)e)Q$BN
打开你的Virtools Dev,把我们刚编写的Show_Top_Exit,放到你的Level Script,编辑他的参数列表,应该如图所示
v4Ss'_Sh(D}%` w0
)Tr:b7\LG%_I:P0
e-EXl^[1i~(X0 奥古多媒体jB ?y&W NFy"z;O
奥古多媒体{u&^ FUU3}*Ik
在int Time_Top_Exit(const CKBehaviorContext& BehContext)接口中来实现我们要完成的功能:奥古多媒体{!GtvB3R
奥古多媒体L]{ PCb VWE \ GpD
在这个文件顶部加入Code,来实现包含API和Time头文件奥古多媒体:Q3Y]H+@RY2J
奥古多媒体 {\'oX/U8x
#include "windows.h"
[q+_*D&S0 #include "time.h"
|&r2[SdE0
PY7RD1M0 加入这三行Code,初始化BB:
a8xu|)Sd0 奥古多媒体7M}~(v7|?l
CKBehavior *beh = BehContext.Behavior;//取得BB的上下文举柄
^"X9?!DX0 beh->ActivateInput(0,FALSE);//奥古多媒体6w+v j,JdU5A1lE6o F
beh->ActivateOutput(0);//初始化输入输出流状态奥古多媒体1xX0i*x4drVd O$rUPb
奥古多媒体9Q9k)^3\e kzhP
完成第一个功能:奥古多媒体i*_ x&Mp"q A:G'Ly7r Kv:z

)bhc|-Lzn,]0 声明我们要用到的表述时间的变量:奥古多媒体hI;`1a5vK,P?#A

(pth$V$K;~|6g9W6C RT0 char tmpbuf[128], ampm[] = "AM";
?| R[ x6c.gG3Z0 char *tempstr=NULL;奥古多媒体([ xbl+[2l:RQ
struct tm *today,*newtime;
%KM[_ov8eU0 long lTime;
C O)rc.y0 奥古多媒体Z5j+?^8l@5G
刷新当前的时间环境变量:
i;NqM W/U`xZ0 奥古多媒体*Zo&q3x+fvE
_tzset();奥古多媒体dg#jU/T-Xjwr I

G9Up%x4H'W/R*X X r0 根据Loop的状态来设置相应的输入输出状态:奥古多媒体5C m5u8Sz-Z BIUW \$a

6dM K&Yk$Fe,I0 if( beh->IsInputActive(0) )
u @#d6~!o.hR2va0 {
m i*?)DN/qt0 beh->ActivateInput(0,FALSE);奥古多媒体:v&E5Tq mfp6KEI
}
I;l#Y[m#We0 else {奥古多媒体;V K;m_(O}*qlP(Z
beh->ActivateInput(1,FALSE);
Zpm$] ?{_!CD0 beh->GetOutputParameterValue(0,&elapsedTime);
1|w R2`H0 }
5i7E)xK4p9C/R0
LOXx-t'n6_*p#V0 声明我们要用到的枚举值,取得当前用户选择的ID奥古多媒体:N1e(lnv/Xj l_7e&M

LG)S/~k(Ag0v0 SHOWTIMETYPENUM type;
"NF0SFTQ0 beh->GetInputParameterValue(0,&type);
FbE![3j/b0 奥古多媒体 b1Dqf;l8D.a
根据枚举值,进行判断:奥古多媒体x7IUv{Xk-@1R]
奥古多媒体 D-IY%n1t
switch(type)奥古多媒体/\-o k2nA(d(T.X
{
4YITq^6d7TY.r0 case OSTIME:
$jI|8r:Jy0 _strtime(tmpbuf);
:{1M)wrn\h*Y)b%]H9L0 break;奥古多媒体xcp{6e l!CXb
case OSDATE:奥古多媒体b/OK ]/T7a0t2K
_strdate(tmpbuf);
8T-Pl/?5k0 break;奥古多媒体@'PO*~,`-lS
case UNIX_TIME_AND_DATE:
u%I V c%o-HT F-U9n6~;m0 time(&lTime);
OTwM!Z}i0 newtime=localtime(&lTime);奥古多媒体 T&I!r%Zm/qM!R
strcpy(tmpbuf,asctime(newtime));奥古多媒体A+Ik#FuY?6q$E8_Q
tmpbuf[24]=' ';奥古多媒体|7Yu5V/t,p
tmpbuf[25]=0;
[ V,{F#M0 break;
.Ap1wRA.P)D1fJ0 case HOUR_TIME_12:奥古多媒体t`/EZ5B2^
time(&lTime);奥古多媒体7UW ?)w%{,O"|
today = localtime( &lTime);
}V6L-es YV0 if( today->tm_hour > 12 )奥古多媒体 D;?R([7LJ
{奥古多媒体5N7yn#b V*n2wk+x
strcpy( ampm, "PM" );
@ l1I.m4h V'[0{k+W0 today->tm_hour -= 12;
q"~g4o.d,q0 }
c*p+C!S6}V| gk0 if( today->tm_hour == 0 ) today->tm_hour = 12;
B5@*LZ-_ WQ.?1E0 sprintf(tmpbuf,"\t\t\t\t%.8s %s",asctime(today)+11,ampm); break;
O#^8g2H5t E0 }
yP7b N$AQ(j0 奥古多媒体9I$~w Z3U#A
输出字符串到我们的第一个输出参数中并激活循环:奥古多媒体&tC0U uS:I#ky+Q J-w.kG `
奥古多媒体H!Um(qe#y
beh->SetOutputParameterValue(0,tmpbuf);奥古多媒体P T$| \jD)qgVP
beh->ActivateOutput(1,TRUE);
c$S@SC;k3p0 奥古多媒体(bA%kiM!|f4ub/_
到现在位置,我们的第一个功能已经实现了.编译你的Dll,在Virtools中进行测试: 奥古多媒体if,U;y"hnV3I(t

v1TR/uP0 奥古多媒体M9Li5I;v9^

P:Se/z+n8_v'r0 奥古多媒体E*`:ETe+u&p
另外两个功能的实现,现在对你来说,是不是也不难实现了?自己动手试试吧,有问题请到论坛提出来
R'P0Z8QxTI k0 http://www.aougu.net/bbs奥古多媒体"s*D_[:a$E&x&_2R
奥古多媒体g*~5b$Vk'BC n
请到论坛下载相关例子:http://www.aougu.net/bbs/index.php?...id=28772&page=2
顶:9 踩:7
对本文中的事件或人物打分:
当前平均分:-0.06 (51次打分)
对本篇资讯内容的质量打分:
当前平均分:-0.09 (53次打分)
【已经有47人表态】
9票
感动
3票
路过
5票
高兴
8票
难过
6票
搞笑
6票
愤怒
7票
无聊
3票
同情
上一篇 下一篇

网络资源


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