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

沒畫完的畫

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

Transparent Flash Control

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

在網(wǎng)頁中只需要加入以下代碼

<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> 
就可以實現(xiàn) Flash 背景透明

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

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

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

在DEMO里實現(xiàn)了一個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 引進(jìn)來,因為里面包含了Flash播放器的相關(guān)接口定義,它就是我們要放到容器里的 ActiveX 對象了
#import "flash.ocx" named_guids 

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

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

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

Create() 函數(shù)的第一個參數(shù):Flash 播放對象的ClassID
Create() 函數(shù)的第二個參數(shù):窗體的擴(kuò)展風(fēng)格 WS_EX_LAYERED ,據(jù)說加了這個風(fēng)格才能實現(xiàn)透明 Flash ,為啥?
……

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

值得注意的是

OleCreate() 函數(shù)用來創(chuàng)建一個 IOleObject 對象的實例,需要 把 Ole 容器 的 IOleClientSite 和 IStorage 作為參數(shù)傳給它
    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 () 函數(shù)通知 IOleObject 對象跟它說,你已經(jīng)被嵌到 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 用來干嘛的??

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

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

這樣,F(xiàn)lash 播放對象就建好了.....

Part 5.
透明窗體的重畫

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

描繪 Flash 播放的內(nèi)容,用 OleDraw() 函數(shù), 在 IViewObject::Draw()  中調(diào)用
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來處理的,在創(chuàng)建后得到一個 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   回復(fù)  更多評論   

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

# re: Transparent Flash Control   回復(fù)  更多評論   

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

# re: Transparent Flash Control   回復(fù)  更多評論   

2009-12-15 15:45 by 楊嚴(yán)
可是 為什么不能直接運行呢。。出了好多調(diào)試錯誤。

# re: Transparent Flash Control   回復(fù)  更多評論   

2010-08-29 21:52 by disala
@楊嚴(yán)
看清楚啦~
他們用了什么函數(shù)?
有dx函數(shù)存在啊,你的vs環(huán)境配置了沒有?

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲午夜av| 亚洲欧美日韩区| 免费看av成人| 亚洲精品日韩精品| 亚洲国产精品综合| 欧美精品久久久久久久免费观看| 亚洲精品在线二区| 日韩一区二区久久| 国产农村妇女毛片精品久久麻豆 | 久久精品一区二区三区四区| 国内精品久久久久久久97牛牛| 麻豆精品在线视频| 欧美激情综合五月色丁香小说| 一本久道久久综合中文字幕| 亚洲午夜羞羞片| 国产主播精品| 亚洲国产另类精品专区 | 亚洲一区二区三区四区在线观看| 国产伦精品一区二区三区四区免费| 久久国产精品黑丝| 欧美成人午夜视频| 亚洲欧美综合v| 蜜臀av性久久久久蜜臀aⅴ| 9色精品在线| 性做久久久久久| 亚洲精品欧美激情| 小黄鸭精品密入口导航| 亚洲韩国精品一区| 亚洲一二三区在线观看| 最新日韩欧美| 亚洲一区二区在线| 亚洲欧洲一区二区天堂久久| 亚洲在线观看免费视频| 亚洲九九精品| 久久黄色小说| 性欧美xxxx大乳国产app| 美女性感视频久久久| 先锋影院在线亚洲| 欧美日韩国产一区二区| 久久综合色88| 国产精品免费电影| 亚洲精品五月天| 在线播放豆国产99亚洲| 亚洲欧美日韩在线观看a三区| 亚洲精品少妇| 久久一区二区三区四区| 久久九九国产精品| 国产精品一区二区你懂得| 亚洲欧洲日产国产综合网| 精品999网站| 久久国产99| 久久福利毛片| 国产精品婷婷午夜在线观看| 亚洲免费观看在线观看| 亚洲精品一区二区三区99| 久久精品免费电影| 欧美一区二区精品| 国产精品五月天| 亚洲性夜色噜噜噜7777| 亚洲午夜免费福利视频| 欧美韩日一区| 亚洲精品国产精品国自产观看浪潮| 一区二区三区在线高清| 久久精品亚洲热| 噜噜噜躁狠狠躁狠狠精品视频| 国产日本欧洲亚洲| 午夜精品电影| 久久看片网站| 在线免费不卡视频| 老司机免费视频一区二区| 欧美福利专区| 亚洲毛片av| 欧美午夜www高清视频| 一区二区三区四区蜜桃| 亚洲婷婷综合久久一本伊一区| 欧美日韩成人综合| 国产精品99久久久久久久久久久久 | 欧美专区福利在线| 久久综合久色欧美综合狠狠 | 欧美大片一区二区三区| 亚洲精品久久久久久久久久久久 | 99成人精品| 欧美三级网址| 香蕉久久久久久久av网站| 久久成人综合视频| 在线观看欧美日韩国产| 欧美福利精品| 一本色道久久综合亚洲精品不卡 | 久久久亚洲影院你懂的| 曰韩精品一区二区| 欧美日韩国产高清| 亚洲欧美日韩一区在线| 欧美成人免费一级人片100| 亚洲精品国久久99热| 国产精品高潮呻吟| 久久久91精品国产| 亚洲免费高清| 久热精品视频在线| 亚洲免费一在线| 在线成人黄色| 国产精品v欧美精品v日韩| 久久国产精品久久w女人spa| 欧美高清视频一区| 亚洲欧美日韩久久精品| 亚洲国产欧美一区二区三区久久| 欧美日韩四区| 久久久久久久久综合| 999亚洲国产精| 欧美wwwwww| 亚洲免费视频网站| 亚洲人www| 韩国女主播一区| 欧美日韩在线一区二区| 久久久久久久综合日本| 亚洲午夜高清视频| 亚洲国产精品免费| 久久人人爽人人爽爽久久| 一区二区三区免费在线观看| 韩国精品在线观看| 国产精品午夜国产小视频| 欧美日本不卡高清| 久久男人av资源网站| 欧美一级电影久久| 亚洲性图久久| 亚洲伦理在线| 亚洲大胆美女视频| 免费中文字幕日韩欧美| 欧美在线看片a免费观看| 在线视频精品一区| 日韩一级不卡| 亚洲精品国产精品国自产观看| 国产综合一区二区| 国产欧美午夜| 国产女人水真多18毛片18精品视频| 欧美人与性动交a欧美精品| 美日韩精品视频免费看| 久久这里有精品视频| 久久精品国产精品亚洲综合| 午夜视频久久久| 亚洲欧美日韩精品久久| 亚洲一区二区高清| 亚洲一卡二卡三卡四卡五卡| 99www免费人成精品| 一本高清dvd不卡在线观看| 日韩一级在线观看| 亚洲理论在线观看| 艳女tv在线观看国产一区| 91久久国产综合久久| 亚洲人成77777在线观看网| 亚洲电影专区| 亚洲日本中文| 日韩小视频在线观看专区| 99精品欧美一区二区三区| aa成人免费视频| 亚洲一级二级| 欧美一区二区三区四区视频| 久久激情五月丁香伊人| 久久中文字幕导航| 欧美精品www| 国产精品久久久久aaaa樱花 | 久久久亚洲精品一区二区三区| 久久精品99久久香蕉国产色戒| 久久精品在线观看| 鲁大师成人一区二区三区 | 午夜天堂精品久久久久| 欧美在线国产| 蜜臀久久久99精品久久久久久| 欧美岛国激情| 国产精品成人一区| 国产有码一区二区| 91久久极品少妇xxxxⅹ软件| 在线中文字幕不卡| 欧美在线观看一区二区| 蜜臀a∨国产成人精品| 91久久精品美女| 亚洲一区中文| 蜜臀va亚洲va欧美va天堂| 欧美色视频在线| 国产自产女人91一区在线观看| 亚洲激情视频| 销魂美女一区二区三区视频在线| 久久网站免费| 艳女tv在线观看国产一区| 久久国产精品久久久久久久久久| 毛片av中文字幕一区二区| 国产精品久久7| 亚洲福利在线看| 午夜免费日韩视频| 亚洲第一天堂无码专区| 亚洲欧美日韩国产一区二区| 免费91麻豆精品国产自产在线观看| 国产精品久久久久久久电影| 在线精品福利| 欧美在线观看www| 亚洲精品欧美日韩专区| 久久久久国色av免费观看性色| 欧美日韩亚洲一区二区三区| 在线精品视频免费观看| 亚洲永久字幕| 亚洲精品激情|