3,245
社区成员
发帖
与我相关
我的任务
分享
#pragma once
#include <atlhost.h>
#import "sdflash.ocx" \
raw_interfaces_only, /* Don't add raw_ to method names */ \
raw_native_types, /* Don't map to DTC smart types */ \
named_guids, /* Named guids and declspecs */ \
no_namespace, /* Don't wrap with C++ name space */ \
exclude("IServiceProvider"),\
rename("IDispatchEx","IMyDispatchEx")
#ifdef _DEBUG //DEBUG版本
#include "./Debug/sdflash.tlh"
#else //release版本
#include "./Release/sdflash.tlh"
#endif
class CFlash
{
public:
CFlash(void);
~CFlash(void);
public:
BOOL CreateWithMFC(HWND hwnd);//直接绑定到MFC窗口上
BOOL Create(HWND hwnd);//窗口一个FLASH窗口
BOOL Destroy();//销毁FLASH控件
BOOL SetWMode(LPCWSTR strMode);//设置FLASH显示模式
CString GetWMode();//获取FLASH显示模式
BOOL SetQuality(LPCWSTR strMode);//设置FLASH画质
CString GetQuality();//获取FLASH画质
BOOL SetFlashVars(LPCWSTR strVars);//设置FlashVar
CString GetFlashVars();//获取FlashVar
BOOL SetVariable(LPCWSTR strName, LPCWSTR strValue);//设置Flash变量
CString GetVariable(LPCWSTR strName);//获取Flash变量
BOOL LoadMovie(LPCWSTR strUrl);//载入url Movie
BOOL isPlaying();
BOOL Play();
BOOL Stop();
void FullWindow();//使FLASH窗口铺满父窗口
void SetRect(RECT& rt);//设置FLASH窗口大小, 参数必须是用 ::GetClientRect函数获取
BOOL Show();//显示FLASH窗口
BOOL Hide();//隐藏FLASH窗口
public:
CComQIPtr<IShockwaveFlash> m_pf;//IShockwaveFlash对象指针
CComQIPtr<IViewObject2> m_po;//IViewObject2对象指针
CAxWindow* m_pAxWnd;//activex控件宿主窗口
HWND m_hWnd;//FLASH窗口句柄
};
//宏定义 FLASH画质
#define _Quality_Low L"low" //0 low和medium值一样
#define _Quality_Medium L"medium" //0 low和medium值一样
#define _Quality_High L"high" //1 high和best值一样
#define _Quality_Autolow L"autolow" //2
#define _Quality_Autohigh L"autohigh" //3
#define _Quality_Best L"best" //1 high和best值一样
#define _wMode_window L"window"
#define _wMode_opaque L"opaque"
#define _wMode_transparent L"transparent"
#define _wMode_direct L"direct"
#define _wMode_gpu L"gpu"
#include "StdAfx.h"
#include "Flash.h"
CComModule _Module;
extern __declspec(selectany) CAtlModule* _pAtlModule=&_Module;
CFlash::CFlash(void)
{
if(FAILED(::CoInitialize(NULL)))
{
AfxMessageBox(L"CoInitialize Failed!\r\n");
return;
}
m_pAxWnd = NULL;
}
CFlash::~CFlash(void)
{
Destroy();
::CoUninitialize();
}
BOOL CFlash::CreateWithMFC(HWND hwnd)
{
RECT rt = {0};
::GetClientRect(hwnd, &rt);
//创建 IShockwaveFlash 对象
HRESULT hr = ::CoCreateInstance(__uuidof(ShockwaveFlash),NULL,CLSCTX_INPROC_SERVER,__uuidof(IShockwaveFlash),(void **)&m_pf);
if (m_pf == NULL)
{
::MessageBox(NULL, L"IShockwaveFlash 创建失败", L"错误", MB_OK);
return FALSE;
}
//查询 IViewObject2对象
hr = m_pf->QueryInterface(__uuidof(IViewObject2),(void **)&m_po);
if (m_po == NULL)
{
::MessageBox(NULL, L"IViewObject2 查询失败", L"错误", MB_OK);
return FALSE;
}
//绑定到MFC的窗口上
hr = ::AtlAxAttachControl(m_pf,hwnd,NULL);
if (FAILED(hr))
{
::MessageBox(NULL, L"IShockwaveFlash绑定窗口失败", L"错误", MB_OK);
return FALSE;
}
return TRUE;
}
BOOL CFlash::Create(HWND hwnd)
{
RECT rt = {0};
::GetClientRect(hwnd, &rt);
rt.bottom -= 50;
//对于ATL3.0 必须调用AtlAxWinInit,否则Create会调用失败
if (AtlAxWinInit() == FALSE)
{
::MessageBox(NULL, L"初始化容器窗口的注册类 失败", L"错误", MB_OK);
return FALSE;
}
m_pAxWnd = new CAxWindow();
if (m_pAxWnd == NULL)
{
::MessageBox(NULL, L"new CAxWindow(); 失败", L"错误", MB_OK);
return FALSE;
}
//创建Shock wave flash控件
WCHAR wszCtlName[64] = L"ShockwaveFlash.ShockwaveFlash";
m_hWnd = m_pAxWnd->Create(hwnd, rt, wszCtlName,WS_CHILD | WS_VISIBLE);
if (m_hWnd == NULL)
{
::MessageBox(NULL, L"控件窗口 创建失败", L"错误", MB_OK);
return FALSE;
}
CComPtr<IUnknown> pUk = NULL;
m_pAxWnd->QueryControl(&pUk);
if (pUk == NULL)
{
::MessageBox(NULL, L"查询IUnknown 失败", L"错误", MB_OK);
return FALSE;
}
HRESULT hr = pUk->QueryInterface(IID_IShockwaveFlash,(void**)&m_pf);
if (m_pf == NULL)
{
::MessageBox(NULL, L"IShockwaveFlash 查询失败", L"错误", MB_OK);
return FALSE;
}
hr = m_pf->QueryInterface(IID_IViewObject2,(void**)&m_po);
if (m_po == NULL)
{
::MessageBox(NULL, L"IViewObject2 查询失败", L"错误", MB_OK);
return FALSE;
}
m_pf->put_AllowFullScreen(L"true");
m_pf->put_AllowNetworking(L"all");
m_pf->put_BackgroundColor(0x0);//黑色背景
m_pf->put_AllowScriptAccess(L"always");//允许脚本
m_pf->put_WMode(_wMode_window);
m_pf->put_Quality2(_Quality_Low);
return TRUE;
}
BOOL CFlash::Destroy()//销毁FLASH控件
{
if (m_hWnd)
{
::SendMessage(m_hWnd, WM_CLOSE, 0, 0);
::SendMessage(m_hWnd, WM_DESTROY, 0, 0);
::SendMessage(m_hWnd, WM_NCDESTROY, 0, 0);
m_hWnd = NULL;
}
if (m_po != NULL)
m_po.Release();
if (m_pf != NULL)
m_pf.Release();
if (m_pAxWnd != NULL)
{
delete m_pAxWnd;
m_pAxWnd = NULL;
}
return TRUE;
}
BOOL CFlash::SetWMode(LPCWSTR strMode)
{
if (m_pf == NULL)
return FALSE;
return m_pf->put_WMode(CComBSTR(strMode)) == S_OK;
}
CString CFlash::GetWMode()
{
CComBSTR bstrMode;
m_pf->get_WMode(&bstrMode);
return (CString)bstrMode;
}
BOOL CFlash::SetQuality(LPCWSTR strMode)
{
return m_pf->put_Quality2(CComBSTR(strMode)) == S_OK;
}
CString CFlash::GetQuality()
{
CComBSTR bstrQu;
m_pf->get_Quality2(&bstrQu);
return (CString)bstrQu;
}
void CFlash::FullWindow()
{
HWND hParent = ::GetParent(m_hWnd);
RECT rt = {0};
::GetClientRect(hParent, &rt);
SetRect(rt);
}
void CFlash::SetRect(RECT& rt)//设置FLASH窗口大小, 参数必须是用 ::GetClientRect函数获取
{
int nWith = rt.right - rt.left;
int nHeight = rt.bottom - rt.top;
::MoveWindow(m_hWnd,rt.left,rt.top,nWith,nHeight,TRUE);
}
BOOL CFlash::SetFlashVars(LPCWSTR strVars)//设置FlashVar
{
return m_pf->put_FlashVars(CComBSTR(strVars)) == S_OK;
}
CString CFlash::GetFlashVars()//获取FlashVar
{
CComBSTR bstrVars;
m_pf->get_FlashVars(&bstrVars);
return (CString)bstrVars;
}
BOOL CFlash::SetVariable(LPCWSTR strName, LPCWSTR strValue)//设置FLASH变量
{
return m_pf->SetVariable(CComBSTR(strName), CComBSTR(strValue)) == S_OK;
}
CString CFlash::GetVariable(LPCWSTR strName)//获取FLASH变量
{
CComBSTR bstrValue;
m_pf->GetVariable(CComBSTR(strName), &bstrValue);
return (CString)bstrValue;
}
BOOL CFlash::LoadMovie(LPCWSTR strUrl)//载入url Movie
{
return m_pf->LoadMovie(0, CComBSTR(strUrl)) == S_OK;
}
BOOL CFlash::isPlaying()
{
VARIANT_BOOL vb;
m_pf->IsPlaying(&vb);
return vb != FALSE;
}
BOOL CFlash::Play()
{
return m_pf->Play() == S_OK;
}
BOOL CFlash::Stop()
{
return m_pf->Stop() == S_OK;
}
BOOL CFlash::Show()
{
return ::ShowWindow(m_hWnd,SW_SHOW);
}
BOOL CFlash::Hide()
{
return ::ShowWindow(m_hWnd,SW_HIDE);
}
void CswftestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
m_f.Create(GetSafeHwnd());
m_f.SetFlashVars(L"assetsHost=http://res.zfd.zhi-ming.com/QQstable/elements/&socket_ip=119.29.73.239&socket_port=23089&serverId=S3097&isOpenGm=0&goldExtract=0&isAdult=1&time=1593743917&author=D46A6999E3ED64325008D2C5E943FB3C&authorKey=D46A6999E3ED64325008D2C5E943FB3C&autoMode=0&version=5201314&mainVersion=2014112010&mainswfVersion=202006281655&platform=qqgame&official=http://rc.qzone.qq.com/1104216374&bbs=&recharge=&client=1¶ms=pf%3Dqqgame%26serverid%3D6612%26openid%3DD46A6999E3ED64325008D2C5E943FB3C%26openkey%3D1EB0314F500C48DC84CC9285747422DE%26seqid%3D381f5a71d48c1418179dcb9f8f811264%26pfkey%3DE9EB03845BA7578B2D50E51E5D4F6DD4%26manyouid%3Dnull%26appid%3D1104216374µClient=-1&comm_params=linkType%3DlinkUrl%3BlinkUrl%3Dhttp%3A%2F%2Fhuodong.37.com%2Fdist%2Fcqby%2F20190115%2F&sign=c57a491413857aa0d9630133b282044c&loginClient=http://dldir1.qq.com/box/QQmicrogamebox/release/1104216374/8/CQBY_latest.exe&isDebug=0&isClickLog=0");
m_f.m_pf->LoadMovie(0,L"http://res.zfd.zhi-ming.com/QQstable/mir/main.swf?ver=1593743917");
m_f.Play();
}
#import "sdflash.ocx" \
raw_interfaces_only, /* Don't add raw_ to method names */ \
raw_native_types, /* Don't map to DTC smart types */ \
named_guids, /* Named guids and declspecs */ \
no_namespace, /* Don't wrap with C++ name space */ \
exclude("IServiceProvider"),\
rename("IDispatchEx","IMyDispatchEx")
这里没有起作用, 大侠们知道为什么么
#import "sdflash.ocx" \
raw_interfaces_only, /* Don't add raw_ to method names */ \
raw_native_types, /* Don't map to DTC smart types */ \
named_guids, /* Named guids and declspecs */ \
no_namespace, /* Don't wrap with C++ name space */ \
exclude("IServiceProvider"),\
rename("IDispatchEx","IMyDispatchEx")\
rename("ICanHandleException", "IMyCanHandleException")