时间:2014-10-28 13:17:13 来源: 复制分享
用VB程序做主框架来调用Authorware程序,当整个东西很大的时候, 一般不会做成一个文件,尤其对于多媒体课件来说, 如果能把各个章节、模块分成几个独立的文件,那是最好的。然而如果单单用Authorware的话,总不能尽如人意的做到这一点。尽管可以用JumpFile、JumpOut等等函数,也可以用库将资源独立出来,但是在考虑总体结构的时候,总是存在一些问题。衔接不够紧密,不能使用公共的模块,几个文件相互通讯困难,而且当框架功能比较复杂时,Authorware便显的能力不足了。
我在用Authorware做了一段框架之后,想到了一个方法可以用VB(其它的应该也可以,只不过VB简单一些而已)来控制我的Authorware程序。我将这个方法用到我的课件中,实践证明是可行的。
这儿我简要的说一下原理,如果您想进一步了解的话请到166.111.26.24/YeyaSrc下载原程序。
原理:
1.在VB程序里可以通过发送键盘或鼠标消息来激活Authorware程序中的交互。比如:在Authorware中定义一个永久的热区交互,同时设置热键为F12,那么,在VB程序中先用SetFocus将输入聚焦定位到Authorware窗口(假设已经知道了Authorware窗口的句柄,如何得到句柄下面进一步讨论),然后用PostMessage(或者SendMessage)给它发送一个F12的KeyDown消息。
2.同样Authorware程序也可以给VB程序发消息,让它响应。(根据我的试验,用MouseDown消息更好一些,可以发送0,0坐标,甚至负值的坐标的MouseDown消息,总之是用户不可能点到的地方,在VB程序的Form_MouseDown事件中再判断一下坐标。)
3.如何传递参数。VB要控制Authorware程序作动作必然要传递一些参数(当然你可以指定F11翻到下一页,但是要翻到第5页怎么办?)。
应用程序之间传递参数可以用DDE,但是这太复杂了。我想到的一个简单的方法是利用dll的全局变量。dll有自己的数据段,我们可以通过引出函数来实现各个程序对dll全局数据的访问。一个简单的例子如下:
int g_iMsg; //定义一个全局变量。
//通过这个函数设置g_iMsg的值。
extern "C" void FAR PASCAL _expert SetMsg(int val)
{
g_iMsg=val
}
//通过这个函数读取g_iMsg的值。
extern "C" int FAR PASCAL _expert GetMsg()
{
return g_iMsg
}
这样两个应用程序便可以通过同一个dll来传递参数-一个用SetMsg()给g_iMsg赋值,另一个用GetMsg()读出这个值。
(对于传递字符串要复杂一些,但应该也是可以的。)
4.有了传递参数的方法之后,那么用VB程序启动Authorware程序之前,先在dll中设置初始化的消息号、VB窗口句柄等等参数;然后当Authorware程序启动,它首先到dll中读出这些参数,(如果消息号不是初始化的消息号,说明不是由VB程序启动)保存VB窗口句柄。然后用2中说的方法给VB发回应消息,同时传递自己的窗口句柄等参数。
5.接下去,有了对方的窗口句柄之后,就可以用1、2中的方法给对方发消息,同时用3的方法传递参数,这样双方便可以响应对方的消息,并根据参数做相应的动作。