当前Flash很流行,而且Flash以控件形式提供IE,既然是控件,我们就可以用VC或别的什么语言来控制它。Flash 控件的播放功能很好实现,它有一个强大的命令 FSCommand,可用来向应用程序发消息,截获此消息,我们可以实现很多功能。这样就可以结合Flash的漂亮界面与VC的强大功能!
下面以用Flash控件做CD的autorun为例说明:CD自启动程序一般是运行后有一个界面,进而有不同的安装项,这里,先应作一个Flash动画,一个漂亮的界面,加上几个按钮,点不同的按钮,就发出不同的FSCommand命令。FSCommand由命令就是两个字符串,响应FSCommand事件应用程序可能得到这两个字符串,相关设计可以参考Flash动画制作的相关书籍,这里不作说明先用VC建一单文档无View/Doc的项目,导入flash控件,从头文件shockwaveflash.h上可以看出,我们可能控制动很多细节,这里,我只关Create和SetMovie函数
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL) { return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); } void SetMovie(LPCTSTR lpszNewValue);
在类CChildView中加入一个Flash控件,方法,在头文件中定义public: CShockwaveFlash m_flash;重载CChildView的OnCreate
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CWnd ::OnCreate(lpCreateStruct) == -1) return -1; m_flash.Create(NULL,NULL, WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, FLASHID); m_flash.SetMovie(szWorkPath+"Autorun.SWF"); return 0;}
上面SetMovie的参数是flash文件的完整文件名
最后就是响应动画的FSCommand命令,即在CChildView中响应FSCommand事件
BEGIN_EVENTSINK_MAP(CChildView,CWnd) ON_EVENT(CChildView, FLASHID, 150 /* FSCommand */, OnFSCommandFlash, VTS_BSTR VTS_BSTR)END_EVENTSINK_MAP()
afx_msg void CChildView::OnFSCommandFlash(LPCTSTR command, LPCTSTR args) { if(strcmp(command,"quit")==0) { m_flash.Stop(); AfxGetMainWnd()->PostMessage(WM_CLOSE); } else if(strcmp(command,"SetupPath")==0) DoRun( args ); else if(strcmp(command,"OpenPath")==0) DoExplore( args ); else { }}其中 command 和 args 就是FSCommand发出的两个字符串,由于command, 和 args 内容由动画文件autorun.swf来确定,改变autorun.swf就可以有不同的CD自启动程序。上例中,有一个按钮发出的是 {"quit", ""} 令程序退出另有一个按钮发出的是 {"OpenPath", ""} 令程序打开当前目录还有几个是{"SetupPath", "soft1/setup.exe"} 令程序运行子目录soft1下的setup.exe即安装soft1,同样,可能还有按钮发出的是 {"SetupPath", "soft2/setup.exe"} 安装soft2{"SetupPath", "soft3/setup.exe"} 安装soft3
是不是很简单