首先当然就是要利用MFC AppWizard建一个对话框窗口,然后在主菜单里选择“工程->添加工程->components and controls”菜单选项,这时会弹出一个components and controls gallery文件选择对话框,里面有两个文件夹,一个是registered activex controls,一个是visual c++ components。选择第一文件夹后会出现一系列系统上已注册过的activex控件。这时候要检查里面是否有shockwave flash object这个控件,没有的话就得自己去下载一个了,点击insert将它插入工程。因为在vc中插入工程的控件要通过一个类来操作,所以这时vc会提示你为这个控件指定一个类名,可以使用默认的类名就行了。插入后vc会自动把这个类加入工程里面。这时候就可以利用这个生成的类定义一个对象。插入shockwave flash object控件后,你会发现在对话框编辑器那里多出了一个图标,和使用BUTTON、EDIT等其它windows控件一样,把它拉到对话框上,让它跟刚刚定义的那个对象(是插入控件后生成的类类型)关联,不知道怎么利用VC关联的话就在AppWizard生成的对话框类中的DoDataExchange函数插入DDX_Control(pDX, ID号, 定义的对象名)。
这时候就可以使用成员函数LoadMovie和Play来导入并播放动画了,这里我们假设定义的对象名为Flash。Flashr.LoadMovie(0, strMovieUrl);该函数用来将动画导入程序中,strMovieUrl为要播放的flash路径,要用绝对路径。 Flash.Play();调用该函数开始播放动画。在初始化对话框的函数(OnInitDialog)里面加入这两个函数调用即可。这时候要记得在继承于WinApp的类的InitInstanse函数中调用AfxEnableControlContainer()这个函数,这个函数的作用是你的应用程序成为ActiveX控件包容器。假如你不加进去的话,程序就会运行不了。
假如现在你一切都搞定了,运行一下程序,你会发现Flash已经嵌入到你的程序当中了,但由于是在对话框中,现在没有办法改变它的大小,更糟糕的是,右击后竟然有Flash那个弹出菜单。
我觉得把程序设定为全屏运行是最好的,因为Flash外面有个窗框严重影响了美观,所以可以在对话框初化函数中加入以下代码:
int cx, cy;
HDC dc = ::GetDC(NULL);
cx = GetDeviceCaps(dc,HORZRES) +
GetSystemMetrics(SM_CXBORDER);
cy = GetDeviceCaps(dc,VERTRES) +
GetSystemMetrics(SM_CYBORDER);
::ReleaseDC(0,dc);
//去除标题和边框
SetWindowLong(m_hWnd, GWL_STYLE,
GetWindowLong(m_hWnd, GWL_STYLE) &
(~(WS_CAPTION | WS_BORDER)));
// 置对话框为最顶端并扩充到整个屏幕
::SetWindowPos(m_hWnd, HWND_TOPMOST,
-(GetSystemMetrics(SM_CXBORDER)+1),
-(GetSystemMetrics(SM_CYBORDER)+1),
cx+1,cy+1, SWP_NOZORDER);
再运行一下,你是不是发现已经可以全屏了,那个讨厌的窗框也不见了。问题可能又有了,你有没发现Flash并没有相应放大,天呐,怎么办,这样的话全屏有毛用啊?呵呵,不用怕,这时候就要利用ClassWizard在对话框类中重定义OnSize这个虚函数了,在里面加入 :
if(m_FlashPlayer.GetSafeHwnd())
{
m_FlashPlayer.MoveWindow(0, 0, cx, cy);
}
现在问题完美解决了,Oh No,还有一个右键问题。其实问题也不大,也就是在刚刚插入控件时生成的那个类当中截取右键消息,然后处理函数什么都不做就行了。这时要做的就是捕获WM_RBUTTONDOWN消息,再让OnRButtonDown(UINT nFlags, CPoint point)的函数体置空就行了。
至此在界面上应该没有什么问题了(漂不漂亮就要看你设计的Flash),下面介绍在flash动画和自己的程序中传递消息进行交互。
把flash嵌入自己的程序后,用户在flash动画上面操作,想知道用户进行了什么操作,就得让flash动画来告诉我们了。做过flash的人应该知 道flash的动作脚本语言:Action Script。里面有个命令叫FSCommand(command,args);我们就是要通过这个命令向外部发送消息的。这个命令有两个参数,都是字符 串,你可以在flash脚本中指定任意的字符串。比如用户按下flash动画的一个按钮就发送FSCommand("bt","bt1")这样一个消息, 按下另一个按钮发送FSCommand("bt","bt2"),而我们的程序收到FSCommand消息后就对通过两个参数的不同字符串来判断用户按下 的是哪个按钮。
原理就是这样子的,要实现的话就得在flash动画中使用FSCommand发送消息,在我们的程序接收和处理FSCommand消息了。 flash部分的就不讲了。那我们的程序如何才能接收这个消息呢?前面我们讲到,shockwave flash object插入我们的程序后就可以象一个普通的windows控件那样使用它了。要让它接收并处理这个消息当然是使用MFC的类向导进行消息映射了。做 法如下:
1、添加消息处理函数。 在主菜单中选择“查看->类向导”,在弹出的对话框中选择消息映射,在左边的列表框中选择我们刚插入程序的shockwave flash object控件id,右边选择FSCommand, 点击AddFunction,这样就添加了一个FSCommand消息处理函数了。它的形式大概是这样子的:
void CPlayFlashDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args) ;函数有两个参数,就是flash的Action SCript中FSCommand语句中的两个参数。其实并不一定两个参数都用到,flash脚本中可以就使用一个参数,这样这边的函数就只要对第一个参 数进行处理就行了。
没有评论:
发表评论