MFC ActiveX 控件播放Flash

来源:互联网 发布:医疗投资集团 知乎 编辑:程序博客网 时间:2024/04/24 16:04

      我相信应该很多人搞过这个东西了. 本人在这方面是新手呢, 第一次搞就碰了一鼻子灰呢.

    

      这里其实有一个难点, 就是 ActiveX 控件里面调用 ActiveX 控件.  还有一个人为的难点, 就是网上的例子基本是VC 6.0搞的, 我用的IDE 是 VS2005, 所实话我一开始都不知道怎么添加 OnCreate 方法. 我的 VC6.0 装了用不了, 郁闷. 不过 vs2005 可以调试断点, VC6.0 不行, 这个爽多了.

 

      第一个问题在 在MFC控件中调用ActiceX控件 http://www.bafee.cn/JC/Prog2/VC_/1839_20081101015125F1006.HTML 找到答案.

 

      第二个问题解决办法: 在 "类视图" 右击 **Ctrl 类, 选择 "属性",  http://hi.csdn.net/attachment/201005/21/1082190_1274438958rD6B.jpg 图片(这个编辑器, 我无语了, 插入图片js报错, IE6)

 

      闲话不多说了, 开始我们的项目.

 

第一步

 

       新建一个 MFC ActiveX 控件项目, 项目名称 "abcOCX", 其他选项默认即可.

 

第二步

 

       项目创建完毕, 程序中自动包含 3 个类和 1 个library.

  • CabcOCXApp 类, 应用程序类
  • CabcOCXCtrl 类, 控件的窗口类, OnCreate 和 OnDraw 方法的执行类
  • abcOCXLib,  里面有两个接口_DabcOCX 和 _DabcOCXEvents, 包含控件的属性和方法

第三步

 

       我播放flash 是使用了 CShockwaveFlash 控件的, 所以我要把他加进来.

       点击 "项目" -> "添加类" -> "ActiveX 控件中的 MFC 类", 弹出对话框 

       http://hi.csdn.net/attachment/201005/21/1082190_12744409870Zoa.jpg

        选择 "Shockwave Flash Object", 具体看图. 

 

        这样就多了一个类了

  • CShockwaveFlash 类, Flash 控件类

第四步

 

       在 "CabcOCXCtrl.h" 里面添加 CShockwaveFlash 类型的变量 m_flash. (本人是纯手工添加的)

 

       具体是加上 #include "CShockwaveFlash.h"

             

        CShockwaveflash  m_flash;  //或者 CShockwaveflash *m_flash; 这个还要在OnCreaete方法里面写上 m_flash = new CShockwaveflash();

 

第五步(必要)

     

       最重要的一部, 检查 CabcOCXApp.cpp 的 InitInstance() 定义里面是否有 AfxEnableControlContainer(); 这段代码, 没有的话就添加这段代码, 不然你往 m_flash.create方法传实参 this 时, 将会内存冲突(个人认为是空指针问题).

 

第六步(必要)

 

        给 CabcOCXCtrl 类添加 "WM_CREATE" 信息. "类视图" 右击 CabcOCXCtrl  类, 选择 "属性", 在 "属性" 窗口点击 "信息", 下面的操作大家应该都知道了吧.

 

        产生 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct) 方法,

        在里面添加代码

        m_flash.Create(L"flash", WS_CHILD | WS_VISIBLE | WS_HSCROLL| WS_VSCROLL, CRect(0,0, 500,500), this, 102);    //这段代码在其他方法里面执行没作用的

 

         参数就不多说了, 但是如果没有第五步, 这里一定报错, 原因就在 this 身上, 大家可以在这段代码加断点, 自己调试看看.

 

第七步

 

        在 CabcOCXCtrl 类 OnCreate() 方法定义里面在加上代码:

 

         m_flash.LoadMovie(0,L"g:/logo.swf"); //flash 10d.ocx没有setMovie方法
         m_flash.Play();

 

 

第八步

 

      启动调试, 选择 "ActiveX 控件测试容器",  中间的空白地方右击, 选择右键菜单的 "插入新控件", 哈哈, 知道我的项目命名的好处了吧, 看到 "abcOCX Control" , 双击它, 出来一个方框, 这就是我们的 "abcOCX" ActiveX 控件的窗口了.

 

      当然你也可以选择在 IE 里面测试, 但是前提是你必须把加入这个 ActiveX Object 的 Html 页面写好了.

 

 

      这是一个最简单的例子了, 再高深的我也不会-. -!!

      这个一定要注意的是第五步和第六步, AfxEnableControlContainer(); 和 在 OnCreate() 方法里面执行 m_flash.Create() 方法, m_flash.Create() 方法放在其他方法里面执行是没作用的, 我前面就是在 构造函数CabcOCXCtrl() 里面执行, 结果 Flash 死活不播放, My God!

 

      

     CShockwaveFlash 的 CallFunction() 方法是主要的 VC 代码跟 flash 文件的 ActionScript 交互的接口, 可惜这个方法在 IE 浏览器(纯IE浏览器, IE浏览器内核的不算在内) 不能执行. 这个问题官方也是不管的!  

 

 

 

 

 

 

 

原创粉丝点击