FLASH动画在网络世界里随处可见,深受欢迎。如果在VC编程时集成SWF文件会给软件增色不少,并且VC还可与动画进行交互呢!
一、在VC工程中添加"shockwave flash object 控件",方法是:工程->增加到工程->compnonents and controls..., 在对话框中双击"Registered ActiveX Controls",
然后找到"shockwave flash object"确定即可加入控件到工程中,这时在控件工具栏中就可找到新的图标,把它拖放到对放框中即可;
如果没找到,网上下载flash.ocx, 复制到windows/system32目录并用regsvr32.exe进行注册;
二、通过在“IDC_SHOCKWAVEFLASH1”点击右键菜单“建立类向导...” 关联成员变量:m_FlashPlayer;
我们可以使用m_FlashPlayer来进行flash 动画的控制以及和自己的程序进行交互等操作了;
三、使用成员函数LoadMovie 和Play 来导入并播放动画。
m_FlashPlayer.LoadMovie(0, ls_path);
m_FlashPlayer.Play();
m_FlashPlayer.LoadMovie(0, ls_path);该函数用来将动画导入程序中,ls_path为要播放的flash 路径,要用绝对路径。
m_FlashPlayer.Play();调用该函数开始播放动画。在初始化对话框的函数里面加入这两个函数调用即可。
四、 在flash 动画和自己的程序中传递消息进行交互。
把flash 嵌入自己的程序后,用户在flash 动画上面操作,想知道用户进行了什么操作,就得让flash 动画来告诉我们了。做过flash 的人应该知道flash 的动作脚本语言:Action Script。里面有个命令叫FSCommand(command,args);我们就是要通过这个命令向外部发送消息的。这个命令有两个参数,都是字符串,你可以在flash 脚本中指定任意的字符串。比如用户按下flash 动画的一个按钮就发送FSCommand("bt","bt1")这样一个消息,按下另一个按钮发送FSCommand("bt","bt2"),而我们的程序收到FSCommand 消息后就对通过两个参数的不同字符串来判断用户按下的是哪个按钮。原理就是这样子的,要实现的话就得在flash 动画中使用FSCommand 发送消息,在我们的程序接收和处理FSCommand 消息了。那我们的程序如何才能接收这个消息呢?前面我们讲到,shockwave flash object 插入我们的程序后就可以象一个普通的windows 控件那样使用它了。要让它接收并处理这个消息当然是使用MFC 的类向导进行消息映射了。做法如下:
1、添加消息处理函数。在主菜单中选择“查看->类向导”,在弹出的对话框中选择消息映射,在左边的列表框中选择我们刚插入程序的shockwave flash object 控件id,右边选择
FSCommand, 点击AddFunction,这样就添加了一个FSCommand 消息处理函数了。它的形式大概是这样子的:
void CTestDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args) ;
函数有两个参数,就是flash 的Action SCript 中FSCommand 语句中的两个参数。其实并不一定两个参数都用到,flash 脚本中可以就使用一个参数,这样这边的函数就只要对第一个参数进行处理就行了。
2、编写消息处理代码。在刚添加的FSCommand 消息处理函数中,对两个参数进行处理。其实就是做字符串比较的操作,根据是什么字符串来判断用户进行了什么操作。大概就是这样子的:
void CTestDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
{
char a[100]={0};
UpdateData(true);
if( 0 == strcmp(command,"KeyPress") )
{
if( 0 == strcmp(args,"Delete") )
{
m_edit1.SetFocus();
keybd_event(VK_BACK,0x45,0,0);
keybd_event(VK_BACK,0x45,KEYEVENTF_KEYUP,0);
m_edit1.SetFocus();
}
else if( 0 == strcmp(args,"Space") )
{
memcpy(a,m_cjh,5);
if(memcmp(a,"ADMIN",5)==0)
{
CAdminDlg dlg;
if(dlg.DoModal()==1)
{
CDialog::OnOK();
}
}
if(m_cjh.GetLength()>11)
{
CPOSTVerc dlg;
memcpy(ps_cjhm,m_cjh,m_cjh.GetLength());
if(dlg.DoModal()==1)
{
}
}
}
else if( 0 == strcmp(args,"Asterisk") )
{
m_cjh+="*";
}
else if( 0 == strcmp(args,"CapsLock") )
{
m_caps = !m_caps;
}
else
{
if(m_caps)
{
m_edit1.SetFocus();
keybd_event(args[0],0x45,0,0);
keybd_event(args[0],0x45,KEYEVENTF_KEYUP,0);
m_edit1.SetFocus();
}
else
{
m_edit1.SetFocus();
if((args[0]>=0x30) && (args[0]<=0x39))
{
keybd_event(args[0],0x45,0,0);
keybd_event(args[0],0x45,KEYEVENTF_KEYUP,0);
}
else
{
keybd_event(VK_SHIFT,0,0,0);
keybd_event(args[0],0x45,0,0);
keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
keybd_event(args[0],0x45,KEYEVENTF_KEYUP,0);
}
m_edit1.SetFocus();
}
}
}
else
{
MessageBox(command);
}
UpdateData(false);
}
三、设置和读取flash 动画中的变量。
shockwave flash object 还提供了两个进行交互的函数,一个是CString GetVariable(LPCTSTR name),用来获得flash 动画中变量name 的值,该值以CString 的形式返回给调用者;一个是void SetVariable(LPCTSTR name, LPCTSTR value),可以用来将flash 动画中的name 变量设置一个值value。
使用以上介绍的几个函数就可以在我们的程序和flash 动画间进行很好的交互了。