青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

沒畫完的畫

喂馬 劈柴 BBQ~
posts - 37, comments - 55, trackbacks - 0, articles - 0
  C++博客 ::  :: 新隨筆 :: 聯系 :: 聚合  :: 管理

Transparent Flash Control

Posted on 2008-09-11 22:13 沒畫完的畫 閱讀(4352) 評論(4)  編輯 收藏 引用 所屬分類: Windows COM

在網頁中只需要加入以下代碼

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="600" height="60"> 
<param name="movie" value="test.swf"> 
<param name="quality" value="high"> 
<param name="wmode" value="transparent"> 
<embed src="***.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="600" height="60"></embed> 
</object> 
就可以實現 Flash 背景透明

在VC中要實現 Flash 背影透明播放,Google了一下找到一個 Demo
原文URL:http://www.codeproject.com/KB/COM/flashcontrol.aspx

需要自己實現一個OLE容器,以前很少接觸COM,現在要實現的是一個OLE容器,先汗一下!!!!
想到一個問題:自己實現一個OLE容器跟使用直接使用FlashOcx 控件有何不同?
-- 未解決

Part 1
實現一個ActiveX對象的OLE容器需要繼承幾個接口
IOleClientSite
IOleInPlaceSiteWindowless
IOleInPlaceFrame
IStorage
(具體做什么,需要找資料惡補一下~~~~ ActiveX, OLE容器……)

在DEMO里實現了一個OLE容器類叫 COleContainerWnd
template<CLASS T>
class COleContainerWnd : virtual public IOleClientSite,
                         virtual public IOleInPlaceSiteWindowless, 
                         virtual public IOleInPlaceFrame,
                         virtual public IStorage

是個模板類,T是留給 ActiveX 的接口

Part 2
把 flash.ocx 引進來,因為里面包含了Flash播放器的相關接口定義,它就是我們要放到容器里的 ActiveX 對象了
#import "flash.ocx" named_guids 

Part 3
CFlashWnd派生類
class CFlashWnd: public COleContainerWnd<ShockwaveFlashObjects::IShockwaveFlash>,
                                 public ShockwaveFlashObjects::_IShockwaveFlashEvents,
                                 public ShockwaveFlashObjects::IServiceProvider
再汗一下,CFlashWnd 是個容器,還要實現 public ShockwaveFlashObjects::IServiceProvider 接口作甚?

至于要繼承 ShockwaveFlashObjects::_IShockwaveFlashEvents 接口的目的是為了接收 Flash 動畫發過來的 fscommand() 事件,在 Flash的AS(動作腳本)中調用 FsCommand(),就會
觸發這個事件了
(這是一個精通 Flash 的同學告訴我的!!)

CFlashWnd 對象的創建
g_flashWnd = new CFlashWnd;
g_flashWnd->Create(ShockwaveFlashObjects::CLSID_ShockwaveFlash,
WS_EX_LAYERED, WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS,
g_hWnd, g_hInst); 

Create() 函數的第一個參數:Flash 播放對象的ClassID
Create() 函數的第二個參數:窗體的擴展風格 WS_EX_LAYERED ,據說加了這個風格才能實現透明 Flash ,為啥?
……

Part 4
CFlashWnd::Create() 的內幕
注冊了窗口類,然后就 CreateWindows  了

值得注意的是

OleCreate() 函數用來創建一個 IOleObject 對象的實例,需要 把 Ole 容器 的 IOleClientSite 和 IStorage 作為參數傳給它
    hr = OleCreate(m_CLSID, IID_IOleObject, OLERENDER_DRAW,
        0, (IOleClientSite *)this, (IStorage *)this, (void **)&m_lpO);

不解的是,virtual public IOleInPlaceSiteWindowless 跟 virtual public IOleInPlaceFrame 不用理了?

    hr = OleSetContainedObject(m_lpO, TRUE);

OleSetContainedObject () 函數通知 IOleObject 對象跟它說,你已經被嵌到 OLE 容器里了

hr = m_lpO->QueryInterface(__uuidof(T), (void **)&m_lpControl);
然后用 IOleObject 的 QueryInterface 獲取 IShockwaveFlash 接口(那個 T, 就是 ShockwaveFlashObjects::IShockwaveFlash 了)

    hr = m_lpO->QueryInterface(IID_IViewObjectEx, (void **)&m_lpViewObjectEx);
同樣的方法,也得到了 IViewObjectEx  的接口
IViewObjectEx 用來干嘛的??

要創建一個無窗口的控件,OLE容器需要  IOleInPlaceObjectWindowless 接口來分派消息給對象, 因為 對象本身沒有自己所屬的窗體
另外,IOleInPlaceObject 接口需要重出那個對象

hr = m_lpO->DoVerb(OLEIVERB_SHOW, NULL, (IOleClientSite *)this0, NULL, NULL);
IOleObject::DoVerb() 用來顯示對象和將對象置為運行的狀態

這樣,Flash 播放對象就建好了.....

Part 5.
透明窗體的重畫

1、創建窗體時加上 WS_EX_LAYERED 屬性
2、用 CreateDIBSection() 創建一個 32位的DIB塊, 然后把它 Select 到 DC 里面, It will be an offscreen plain to render window contents to. (這句不知如何譯....)
3、描繪窗體的內容, preserving the alpha channel. (同上..)
4、調用 UpdateLayeredWindow() 函數重畫窗體

描繪 Flash 播放的內容,用 OleDraw() 函數, 在 IViewObject::Draw()  中調用
hr = OleDraw(lpV, DVASPECT_TRANSPARENT, hdcDraw, &rTotal); 

lpV – IViewObject 
interface of flash player control 
hdcDraw – offscreen plain 
rTotal – client rectangle of the container window 

DVASPECT_TRANSPARENT drawing aspect tells the object to draw it's content using alpha blending.

DVASPECT_TRANSPARENT drawing aspect tells the object to draw it's content using alpha blending.

While implementing this, I have met a serious bug in Flash Player Control 8. This bug is only in this version. Players 7 and 9 are free of it. The bug is in the way Flash Control fills the alpha channel of a 32 bit device context. If at least 1 of 255 alpha values is applied to pixel, the colors are mixed correctly, but the resulting alpha channel is set to 255, even if it was initially zero. This makes it impossible to create semitransparent windows. So I had to develop a solution to fix this bug. The solution is quite simple:

These equations are used by Flash Player Control for alpha blending:

R' = Rdst * (1 – alpha) + Rsrc * alpha
G' = Gdst * (1 – alpha) + Gsrc * alpha
B' = Bdst * (1 – alpha) + Bsrc * alpha

If I draw the contents of Flash onto black surface I get

R'black = Rsrc * alpha
G'black = Gsrc * alpha
B'black = Bsrc * alpha

If I draw the contents of Flash onto white surface I get

R'white = 255 * (1 – alpha) + Rsrc * alpha
G'white = 255 * (1 – alpha) + Rsrc * alpha
B'white = 255 * (1 – alpha) + Rsrc * alpha

Here is the system of equations:

R'black = Rsrc * alpha
R'white = 255 * (1 – alpha) + Rsrc * alpha

where alpha and Rsrc are unknown. After solving it you will get:

(255-Alpha) = R'white – R'black

Alpha = 255 – (R'white – R'black)

So, the solution is found. Now, we can draw contents of flash player twice and then correct the corrupted alpha channel.

Part 6. Events
Flash Player 對象的事件是用IDispatch來處理的,在創建后得到一個 IConnectionPointContainer 去獲取 DIID__IShockwaveFlashEvents 的 連接點(connection point)
hr = m_lpControl->QueryInterface(IID_IConnectionPointContainer,
(
void**)&m_lpConCont);
if (FAILED(hr))
return FALSE;
hr 
= m_lpConCont->FindConnectionPoint(
ShockwaveFlashObjects::DIID__IShockwaveFlashEvents, 
&m_lpConPoint);
if (FAILED(hr))
return FALSE;
hr 
= m_lpConPoint->Advise(
(ShockwaveFlashObjects::_IShockwaveFlashEvents
*)this,
&m_dwConPointID);
if (FAILED(hr))
return FALSE;

Part 7. DirectDraw
為了提交重畫的性能,所以使用 DirectDraw 接口
Flash對象通過 ShockwaveFlashObjects::IServiceProvider::raw_RemoteQueryService 這個接口來訪問它
(需要找一下 FlashObject 接口的文檔了解一下)


(眼睛睜不開,需要先睡一會………………)






Feedback

# re: Transparent Flash Control   回復  更多評論   

2008-09-12 10:24 by true
很認真的完成了此文,頂一個!

# re: Transparent Flash Control   回復  更多評論   

2008-09-12 15:37 by 賈春雨
有點暈啊! 真地很厲害。

# re: Transparent Flash Control   回復  更多評論   

2009-12-15 15:45 by 楊嚴
可是 為什么不能直接運行呢。。出了好多調試錯誤。

# re: Transparent Flash Control   回復  更多評論   

2010-08-29 21:52 by disala
@楊嚴
看清楚啦~
他們用了什么函數?
有dx函數存在啊,你的vs環境配置了沒有?
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩一区自拍| 欧美成va人片在线观看| 国产精品免费一区二区三区观看| 亚洲精品视频免费| 亚洲日本久久| 欧美国产日韩一区二区| 中日韩视频在线观看| 一区二区精品| 国产美女高潮久久白浆| 欧美中文在线免费| 久久夜色精品国产亚洲aⅴ| 亚洲福利视频专区| 亚洲高清一区二| 欧美日韩亚洲综合在线| 久久se精品一区二区| 久久国产精彩视频| 日韩亚洲欧美一区| 亚洲免费视频一区二区| 黄色成人在线网站| 亚洲国产老妈| 国产精品国产成人国产三级| 久久天天躁狠狠躁夜夜av| 蜜臀91精品一区二区三区| 99精品免费网| 午夜精品区一区二区三| 最新日韩在线视频| 亚洲性av在线| 亚洲国产精品黑人久久久| 一本色道久久88综合亚洲精品ⅰ| 国产亚洲视频在线| 亚洲高清不卡av| 国产乱码精品一区二区三区五月婷 | 亚洲调教视频在线观看| 香蕉成人久久| 日韩视频在线观看国产| 亚洲综合国产激情另类一区| 亚洲第一黄色网| 亚洲视频你懂的| 亚洲国产小视频在线观看| 在线视频中文亚洲| 亚洲国产二区| 香蕉久久国产| 亚洲一区二区三区中文字幕在线| 欧美一级片一区| 亚洲香蕉成视频在线观看| 老司机免费视频久久| 欧美一区二区大片| 欧美另类变人与禽xxxxx| 久久免费精品视频| 国产精品色午夜在线观看| 亚洲精品乱码久久久久久日本蜜臀 | 欧美日韩网站| 欧美黑人多人双交| 国产一区三区三区| 亚洲女人天堂av| 亚洲视频www| 欧美日韩成人| 亚洲精品美女| 日韩一区二区免费高清| 老司机午夜精品视频| 久久视频精品在线| 国产色产综合产在线视频| 亚洲午夜激情网站| 亚洲香蕉伊综合在人在线视看| 免费视频一区| 欧美国产一区在线| 亚洲国产岛国毛片在线| 久久伊人一区二区| 欧美成人精品在线播放| 一区二区三区自拍| 久久se精品一区精品二区| 久久精品91久久久久久再现| 国产精品日韩专区| 亚洲一区二区日本| 欧美影院午夜播放| 国产日韩一区二区三区| 欧美在线亚洲综合一区| 老司机一区二区| 亚洲国产一区二区视频| 欧美国产第二页| 99精品视频一区二区三区| 亚洲深夜福利| 国产精品国产一区二区 | 米奇777在线欧美播放| 国产亚洲欧美日韩一区二区| 欧美一区二区三区成人| 免费成人性网站| 精品91在线| 欧美国产成人在线| 一区二区三区四区国产精品| 午夜精品久久久久久99热| 国产一区二区视频在线观看| 玖玖视频精品| 一本色道久久88精品综合| 欧美一区三区二区在线观看| 激情欧美丁香| 欧美黄在线观看| 亚洲天堂黄色| 嫩草影视亚洲| 亚洲无线视频| 尤物yw午夜国产精品视频明星| 免费永久网站黄欧美| 一区二区高清视频| 久久久久在线观看| 亚洲理论在线观看| 国产午夜精品美女视频明星a级| 久久精品亚洲| 在线视频精品一区| 蜜桃久久av一区| 亚洲影院色无极综合| 亚洲国产精品久久| 国产精品成人一区| 久久亚洲春色中文字幕| 亚洲天堂免费在线观看视频| 免费看亚洲片| 欧美在线观看一区二区| 日韩手机在线导航| 国产视频一区二区在线观看 | 久久影院午夜论| 亚洲一区综合| 亚洲国产一区二区视频| 久久久久国内| 亚洲一区一卡| 一区二区三区久久| 一区在线免费观看| 国产欧美亚洲日本| 欧美视频在线播放| 欧美激情一区在线| 久久久综合精品| 性欧美精品高清| 亚洲色图制服丝袜| 亚洲伦理一区| 亚洲精品国精品久久99热| 另类激情亚洲| 久久婷婷国产麻豆91天堂| 欧美一级网站| 午夜精品视频一区| 亚洲一区二区在线| 一区二区三区日韩欧美| 91久久国产综合久久| 亚洲成色最大综合在线| 红桃视频一区| 在线成人中文字幕| 亚洲高清视频一区二区| 亚洲高清不卡| 亚洲电影中文字幕| 亚洲国产高清aⅴ视频| 尤物精品在线| 亚洲激情第一页| 亚洲人成人99网站| 99视频热这里只有精品免费| 日韩午夜电影| 国产精品99久久久久久久久| 亚洲综合欧美日韩| 亚洲欧美在线免费| 久久精品国产69国产精品亚洲| 久久精品国产精品亚洲综合 | **性色生活片久久毛片| 伊人男人综合视频网| 狠狠色狠狠色综合| 在线观看日韩专区| 亚洲级视频在线观看免费1级| 亚洲日韩视频| 亚洲一品av免费观看| 亚洲欧美在线看| 久久人人97超碰人人澡爱香蕉| 免费成人av| 亚洲国产综合在线| 亚洲一区二区三区777| 欧美在线观看一二区| 欧美大片一区| 国产精品久久久久久五月尺| 国产一区二区三区免费观看| 亚洲日本理论电影| 亚洲欧美日韩成人| 久久夜色精品亚洲噜噜国产mv| 欧美成人中文字幕| 日韩视频在线观看| 欧美一区精品| 欧美激情一区二区三区在线视频| 国产精品高潮呻吟久久av黑人| 国内精品久久久| 亚洲靠逼com| 久久久国产精品一区二区三区| 亚洲第一在线视频| 亚洲综合视频1区| 蜜桃久久精品乱码一区二区| 国产精品久久久久久久久免费桃花| 激情伊人五月天久久综合| 正在播放欧美视频| 久热精品视频在线观看| 夜色激情一区二区| 美女尤物久久精品| 国产精品影片在线观看| 亚洲美女在线观看| 麻豆国产va免费精品高清在线| 一区二区三区四区精品| 欧美成人免费视频| 国产欧美婷婷中文| 亚洲综合成人婷婷小说|