這裏使用的是以前我說過的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 優化