这里使用的是以前我说过的OLE控件在Direct3D中的渲染方法, 本身不进行swf的解析, 这不现实.编程
- 前提条件: COM编程, OLE编程, DirectX编程, ActionScript/Flash(可选).
- 建立一个ShockwaveFlashObjects::IShockwaveFlash的对象
- 实现一个IOleClientSite来作为IShockwaveFlash的容器
- 绘制
- 经过OleDraw来把GDI的像素数据绘制到DC上(IShockwaveFlash是一个IViewObject)
- 把DC的像素数据拷贝到D3D的Texture上. 中间涉及像素格式的内存操做, 须要明白图像数据的内存格式.
- 半透明支持(可选): 若是不须要半透明支持的话, 其实能够直接OleDraw到Texture的DC上, 不用再多一次拷贝. 可是有时候不得不用(像UI), 能够这参考Transparent Flash Control in plain C++, 用黑色背景和白色背景绘制两次, 比较两次结果 的Red通道计算出相应的Alpha值.
- 脏矩形优化: 若是每帧都进行整个纹理的更新, 你会发现CPU占用率至关高. 实际上ActiveX自己是有这个优化的, 只不过咱们须要本身找出这个矩形. 经过实现IOleInPlaceSiteWindowless::InvalidateRect能够获得相应的"脏"矩形区域, 而后只须要更新相应的纹理区域就能够让效率达到商用的标准.
- 事件响应
- 幸运的是, IShockwaveFlash是一个IOleInPlaceObjectWindowless对象, 那么咱们就能够直接使用IOleInPlaceObjectWindowless::OnWindowMessage进行消息的处理. 注意鼠标坐标的转换和键盘输入焦点的控制.
- 脚本交互, 参考MFC的思路:
- C++调用AS: IShockwaveFlash::CallFunction/SetVariable
- AS调用C++: 须要实现ShockwaveFlashObjects::_IShockwaveFlashEvents, 能够监听fscommand和ExternalInterface.call两种调用方式.
关于具体实现, 已经有人先于我完成了, 因此请直接参考Hikari. 接下来再把IE搞定less
来源 http://blog.csdn.net/xoyojank/article/details/5698191 优化