在VC中加载Flash动画,一种很方便的方式就是在IDE的类向导生成一个IShockwaveFlash接口的包装类。但小弟十分不喜欢VC的可视化向导,几乎很少用,总是喜欢直接拿代码说话。
下面写段播放Flash的简单代码:
首先要利用#import命令导入Flash控件的类型库,如:#import "PROGID:ShockwaveFlash.ShockwaveFlash" nonamespace raw interfaces only
运行一次后会生成flash.tlh文件,程序中需要的接口定义(如IShockwaveFlash接口)就在此文件中生成。
上代码:
代码
// 播放Flash文件
// hWndAttach: 播放Flash文件所依赖的窗口
// lpszFlash: 要播放的Flash文件
inline BOOL PlayFlash(HWND hWndAttach, LPCTSTR lpszFlash)
{
ATLASSERT(::IsWindow(hWndAttach) && ::PathFileExists(lpszFlash));
CComPtr<IShockwaveFlash> spFlash = NULL;
// 创建IShockwaveFlash指针对象
AUX_HRESULT_ASSERT_FAILED_RETURN_VALUE(::CoCreateInstance(__uuidof(ShockwaveFlash), NULL, CLSCTX_ALL, __uuidof(IShockwaveFlash), (LPVOID*)&spFlash), FALSE);
ATLASSERT(spFlash != NULL);
// 设置背景透明
ATLVERIFY(SUCCEEDED(spFlash->put_WMode(L"transparent")));
// 将IShockwaveFlash对象绑定到指定的窗口上
AUX_HRESULT_ASSERT_FAILED_RETURN_VALUE(AtlAxAttachControl(spFlash, hWndAttach, NULL), FALSE);
// 播放Flash文件
AUX_HRESULT_ASSERT_FAILED_RETURN_VALUE(spFlash->put_Movie(CT2OLE(lpszFlash)), FALSE);
return TRUE;
}
// hWndAttach: 播放Flash文件所依赖的窗口
// lpszFlash: 要播放的Flash文件
inline BOOL PlayFlash(HWND hWndAttach, LPCTSTR lpszFlash)
{
ATLASSERT(::IsWindow(hWndAttach) && ::PathFileExists(lpszFlash));
CComPtr<IShockwaveFlash> spFlash = NULL;
// 创建IShockwaveFlash指针对象
AUX_HRESULT_ASSERT_FAILED_RETURN_VALUE(::CoCreateInstance(__uuidof(ShockwaveFlash), NULL, CLSCTX_ALL, __uuidof(IShockwaveFlash), (LPVOID*)&spFlash), FALSE);
ATLASSERT(spFlash != NULL);
// 设置背景透明
ATLVERIFY(SUCCEEDED(spFlash->put_WMode(L"transparent")));
// 将IShockwaveFlash对象绑定到指定的窗口上
AUX_HRESULT_ASSERT_FAILED_RETURN_VALUE(AtlAxAttachControl(spFlash, hWndAttach, NULL), FALSE);
// 播放Flash文件
AUX_HRESULT_ASSERT_FAILED_RETURN_VALUE(spFlash->put_Movie(CT2OLE(lpszFlash)), FALSE);
return TRUE;
}
其中AUX_HRESULT_ASSERT_FAILED_RETURN_VALUE宏是为了简便代码的编写而定义的,定义如下:
代码
#define AUX_ASSERT_FAILED_RETURN_VALUE(expr, ret) \
{ \
BOOL bRet = (expr) ? TRUE : FALSE; \
ATLASSERT(bRet && #expr); \
if (!bRet) return ret; \
}
#define AUX_HRESULT_ASSERT_FAILED_RETURN_VALUE(expr, ret) \
{ \
AUX_ASSERT_FAILED_RETURN_VALUE(SUCCEEDED(expr), ret) \
}
{ \
BOOL bRet = (expr) ? TRUE : FALSE; \
ATLASSERT(bRet && #expr); \
if (!bRet) return ret; \
}
#define AUX_HRESULT_ASSERT_FAILED_RETURN_VALUE(expr, ret) \
{ \
AUX_ASSERT_FAILED_RETURN_VALUE(SUCCEEDED(expr), ret) \
}
完成后,调用:
PlayFlash(this->GetDlgItem(IDC_FLASH), _T("D:\\test.swf"));