图1 注册ActiveX控件
还有一种简单一点的办法,使用regsvr32注册即可,如图2为注册画面:
图2 使用regsvr32注册ActiveX控件
Shockwave Flash Object控件是一种用于播放Flash动画的IE在插件,基于Microsoft Internet Explorer浏览网页并播放Flash时一般不需要进行额外的Flash播放软件的安装。这是因为在安装Flash的时候就已经安装到你的系统上了,Flash5.0版本以下的文件名是swflash.ocx,Flash5.0以上版本的名字是Flash.ocx,在系统目录里面应该可以找到:如Windows XP在C:\WINDOWS\system32\Macromed\Flash下有Flash.ocx。所以我们在本程序的编写过程中并不需要注册这个ActiveX控件。图3中我们可以看到本系统已经注册了Flash9.0版本。
图3 已经注册了的Flash9.0版本ActiveX控件
在VC++ MFC应用程序中引入了Shockwave Flash Object控件并命名后,程序代码中会自动产生CShockwaveFlash类,其框架如图4所示。
图4 CShockwaveFlash的类框架
在VC中CShockwaveFlash的常用函数介绍如下:
Play()
播放动画
StopPlay()
停止动画
IsPlaying()
动画是否正在播放(true,false)
GotoFrame(frame_number)
跳转到某帧(frame_number+1)
TotalFrames()
获取动画总帧数
CurrentFrame()
回传当前动画所在帧数-1
Rewind()
使动画返回第一帧
SetZoomRect(left,top,right,buttom)
放大指定区域
Zoom(percent)
改变动画大小
Pan(x_position,y_position,unit)
使动画在x,y方向上平移
PercentLoaded()
返回动画被载入的百分比(0-100)
LoadMovie(level_number,path)
加载动画
TGotoFrame(movie_clip,frame_number)
movie_clip跳转到指定帧数
TGotoLabel(muvie_clip,label_name)
movie_clip跳转到指定标签
TCurrentFrame(movie_clip)
回传movie_clip当前帧-1
TCurrentLabel(movie_clip)
回传movie_clip当前标签
TPlay(movie_clip)
播放movie_clip
TStopPlay(movie_clip)
停止movie_clip的播放
GetVariable(variable_name)
获取变量
SetVariable(variable_name,value)
变量赋值
TCallFrame(movie_clip,frame_number)
call指定帧上的action
TCallLabel(movie_clip,label)
call指定标签上的action
TGetProperty(movie_clip,property)
获取movie_clip的指定属性
TSetProperty(movie_clip,property,number)
设置movie_clip的指定属性
三、程序实现以及核心代码分析
创建一个基于MFC的单文档(SDI)界面的应用程序,名为FlashCover。创建对话框。打开资源栏,建立一个新对话框,名称设定为IDD_FLASHCOVER_DIALOG,然后建立该对话框的类CFlashCoverDlg。
添加Shockwave Flash Object控件。建立对话框应用程序后,在主菜单里选择“工程->添加至工程->components and controls”菜单选项,此时会弹出一个components and controls gallery文件选择对话框,里面有两个文件夹,一个是registered activex controls,一个是Visual C++ Components。选择第一文件夹后会出现一系列系统上已注册过的activex控件。在里面选择shockwave flash object,点击insert将它插入工程中。因为在VC++中插入工程的控件要通过一个类来操作,所以VC++会提示你为这个控件指定一个类名,可以使用默认的类名就行了。插入后VC++会自动把这个类加入工程里面。具体步骤如图5、6所示。
图5 添加Shockwave Flash Object控件
图6 为Shockwave Flash Object控件类命名
在类CFlashCoverDlg的头文件中添加flash控件的头文件:
#include "ShockwaveFlash.h"。
然后添加两个成员变量:
CString m_FlashFileName; //flash动画的文件名
CShockwaveFlash m_flashctrl; // flash控件的对象
在类CFlashCoverDlg的实现文件中添加如下代码:
CFlashCoverDlg::CFlashCoverDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFlashCoverDlg::IDD, pParent)
{
//开始读取封面配置ini文件
FILE *p_IniFile;
char CoverFileName[80];
CString strPath;
//获取应用程序所在路径 being
//定义文件路径缓冲区
TCHAR strCurDrt[_MAX_PATH];
//获取文件路径
::GetModuleFileName(NULL,strCurDrt,_MAX_PATH);
char* p = strCurDrt;
while(strchr(p,'\\'))
{
p = strchr(p,'\\');
p++;
}
*p = '\0';
strPath = strCurDrt;
//获取应用程序所在路径 End
//获取封面配置文件
CString strIniPath = strPath + "Config\\FlashCover.ini";
//判断封面配置文件是否存在
if((p_IniFile = fopen(strIniPath,"r")) == NULL)
{
AfxMessageBox("Faile to Open File!");
return;
}
else
{
while(!feof(p_IniFile))
{
//读取配置文件内容
fscanf(p_IniFile,"%s",CoverFileName);
}
}
fclose(p_IniFile);
//读取封面配置ini文件结束
//将片头flash文件用播放对话框的成员变量来表示,为以后实现更换不同片头做准备
m_FlashFileName = CoverFileName;
}
用类向导生成CFlashCoverDlg的ON_WM_INITDIALOG消息处理函数OnInitDialog,并添加如下代码:
BOOL CFlashCoverDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//获取屏幕的宽和高
int CX=::GetSystemMetrics(SM_CXSCREEN);
int CY=::GetSystemMetrics(SM_CYSCREEN);
//建立FLASH播放的窗口矩形
CRect rect(0,0,CX,CY);
::MoveWindow(GetSafeHwnd(),0,0,CX,CY,TRUE);
GetClientRect(&rect);
m_flashctrl.Create("FlashCover",WS_POPUP|WS_VISIBLE,rect,this,ID_FLASHWIN,NULL,FALSE,NULL);
char szCurPath[_MAX_PATH];
HINSTANCE hInst=NULL;
GetModuleFileName(hInst,szCurPath,_MAX_PATH);
char* p = szCurPath;
while(strchr(p,'\\'))
{
p = strchr(p,'\\');
p++;
}
*p = '\0';
CString strFilename = szCurPath;
// 获取播放FLASH文件名
strFilename += "flash\\"+m_FlashFileName;
//播放FLASH动画
m_flashctrl.SetMovie(strFilename);
return TRUE;
}
在类CFlashCover的头文件中添加如下头文件:
#include "FlashCoverDlg.h"
//建立flash启动封面对话框变量
CFlashCoverDlg flashDlg;
//建立FLASH窗口启动标志
BOOL nFlag;
然后在CFlashCover的实现文件中的InitInstance函数中添加如下代码:
BOOL CFlashCoverApp::InitInstance()
{
…
//增加flash启动封面
nFlag=TRUE;
flashDlg.DoModal();
SetRegistryKey(_T("计算机学院"));
LoadStdProfileSettings(4); // 加载标准 INI 文件选项(包括 MRU)
…
}
用类向导生成CFlashCoverApp的消息处理函数PreTranslateMessage。
BOOL CFlashCoverApp::PreTranslateMessage(MSG* pMsg)
{
//如果有鼠标或者键盘响应,则终止FLASH窗口
if (flashDlg&&
(pMsg->message==WM_KEYDOWN||
pMsg->message==WM_SYSKEYDOWN||
pMsg->message==WM_LBUTTONDOWN||
pMsg->message==WM_RBUTTONDOWN||
pMsg->message==WM_MBUTTONDOWN||
pMsg->message==WM_NCLBUTTONDOWN||
pMsg->message==WM_NCRBUTTONDOWN||
pMsg->message==WM_NCMBUTTONDOWN))
{
flashDlg.EndDialog(IDCANCEL);
nFlag=FALSE;
return TRUE;
}
return CWinApp::PreTranslateMessage(pMsg);
}
本Flash的UI启动画面程序在VC++6.0,WindowsXP环境下调试通过。编译并运行程序,可以实现预期的Flash动画播放的效果,Flash启动画面执行最终效果如图7所示。
图7 Flash启动画面执行静态效果图
四、结语
本文详细地介绍了在VC++应用程序中使用Flash控件的方法并实现了Flash的UI启动画面。读者在本程序的基础上稍加改造,便能编写出界面美观的应用软件,为用户提供一个良好的操作界面。
VC与FLASH交互
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 动画间进行很好的交互了。