WTL8.0 调用 ActiveX 控件 - (调用 Flash 控件,响应 Flash 控件的事件)

WTL8.0 调用 ActiveX 控件

http://www.cnblogs.com/kylindai/archive/2007/11/28/974797.html 

很久没用WTL了,WTL都升级到8.0了,这两天做了个小例子,WTL调用Flash控件。

目标:使用WTL创建对话框的工程,调用Flash控件播放Flash,并响应Flash控件的事件。
环境:WindowsXP, VC++ 2005, WTL8.0, Flash9

1. 首先用WTL Wizard创建对话框工程,如图:
01.jpg
注意要选中 Enable ActiveX Control Hosting,我习惯于 Generate .CPP Files 这样可以使H文件和CPP文件分开。

工程创建好后,Wizard会为我们在 tWinMain 函数中添加 AtlAxWinInit() 函数,如下:

int  WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE  /*hPrevInstance*/ , LPTSTR lpstrCmdLine,  int  nCmdShow)
{
    HRESULT hRes 
= ::CoInitialize(NULL);
// If you are running on NT 4.0 or higher you can use the following call instead to 
// make the EXE free threaded. This means that calls come in on a random RPC thread.
//    HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
    ATLASSERT(SUCCEEDED(hRes));

    
// this resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used
    ::DefWindowProc(NULL, 000L);

    AtlInitCommonControls(ICC_BAR_CLASSES);    
// add flags to support other controls

    hRes 
= _Module.Init(NULL, hInstance);
    ATLASSERT(SUCCEEDED(hRes));

    AtlAxWinInit();

    
int nRet = Run(lpstrCmdLine, nCmdShow);

    _Module.Term();
    ::CoUninitialize();

    
return nRet;
}


2. 接着在编辑对话框资源,单击右键添加ActiveX控件,这里选择 ShockwaveFlash 1.0控件。如图:
02.jpg



03.jpg

添加好以后,我们需要为这个控件定义一个变量,以便使用控件的方法。我们在CMainDlg类里手工增加ActiveX控件的窗口变量:CAxWindow m_wndFlashPlayer。我们还需要增加ActiveX控件对象的COM接口 CComPtr<IShockwaveFlash> m_FlashPtr,为了增加这个接口,我们需要导入Flash的控件类型库,在 stdafx.h文件中增加如下行:
到此,我们可以编译一下工程,如果没有意外,程序可以正常运行,点击Play按钮,可以播放Flash文件。

4. 下面我们关注如何响应Flash的事件,我们以FSCommand事件为例。
首先编辑对话框资源,右键单击前面添加的Flash控件,选择Add Event Handler,如图:
04.jpg

我们选择添加FSCommand事件的响应处理,响应函数为OnFSCommand,响应的处理放在CMainDlg类中,如图:
05.jpg

添加好后,Wizard会为我们生成事件响应的代码,主要在CMainDlg类中,我们看代码:

# import   " c:/windows/system32/flash9c.ocx "  raw_interfaces_only, raw_native_types, no_namespace, named_guids

raw_interfaces_only 表示以原始接口方式调用Flash类型库里的方法。
no_namespace 表示没有名字空间。
named_guids 表示生成命名的guid变量,如DIID__IShockwaveFlashEvents等变量。

3. 在对话框的初始化函数 OnInitDialog 里将ActiveX控件与变量绑定,如下:

    m_wndFlashPlayer  =  GetDlgItem(IDC_SHOCKWAVEFLASH1);
//     HRESULT hResult = m_wndFlashPlayer.QueryControl(__uuidof(IShockwaveFlash), reinterpret_cast<void**>(&m_FlashPtr));
    HRESULT hResult  =  m_wndFlashPlayer.QueryControl( & m_FlashPtr);
    ATLASSERT(hResult 
==  S_OK);

IDC_SHOCKWAVEFLASH1 是ActiveX控件的资源ID, GetDlgItem 根据资源 ID 得到ActiveX控件的窗口对象,然后窗口对象 m_wndFlashPlayer 使用QueryControl方法得到ActiveX控件的COM对象指针。上面代码中,注释掉的方法也是可用的,但没有注释的使用比较简单。

接着装载一个Flas

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值