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

沒畫完的畫

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

Transparent Flash Control

Posted on 2008-09-11 22:13 沒畫完的畫 閱讀(4339) 評論(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 引進來,因為里面包含了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ù):窗體的擴展風(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
很認真的完成了此文,頂一個!

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

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

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

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

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

2010-08-29 21:52 by disala
@楊嚴
看清楚啦~
他們用了什么函數(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>
            亚洲欧美网站| 亚洲第一二三四五区| 国产一区二区成人| 国产精品久久久久久户外露出 | 国产精品人人做人人爽人人添| 国内精品99| 黄色成人小视频| 亚洲国产专区| 中文在线一区| 久久国产精品一区二区三区四区| 久久久久久伊人| 亚洲国产黄色| 亚洲欧美一级二级三级| 久久中文字幕导航| 国产精品福利在线| 亚洲第一级黄色片| 一本色道精品久久一区二区三区| 欧美一级播放| 亚洲高清电影| 欧美有码在线视频| 欧美日韩成人精品| 伊人精品在线| 欧美一级大片在线观看| 亚洲国产综合在线| 久久精品日韩| 国产精品欧美在线| 99在线精品视频在线观看| 久久精品国产在热久久| 亚洲精品少妇网址| 久久夜色精品| 国产亚洲综合在线| 亚洲午夜激情免费视频| 老司机aⅴ在线精品导航| 亚洲精品网站在线播放gif| 欧美一区视频在线| 欧美天堂亚洲电影院在线观看| 国外成人性视频| 午夜亚洲精品| 9久re热视频在线精品| 欧美激情二区三区| 亚洲高清电影| 久久人人97超碰国产公开结果| 中文网丁香综合网| 欧美肥婆bbw| 在线观看精品一区| 久久精品九九| 亚洲综合精品| 欧美日韩在线大尺度| 亚洲国产一区视频| 米奇777在线欧美播放| 久久精品在线播放| 国产午夜精品理论片a级探花 | 欧美激情中文字幕乱码免费| 亚洲摸下面视频| 国产精品成人aaaaa网站 | 亚洲激情视频在线| 久久久亚洲精品一区二区三区| 亚洲一区二区三区四区在线观看| 久久综合色影院| 午夜精品久久久久久久99水蜜桃| 亚洲看片网站| 欧美日韩一区二区三区在线| 亚洲日韩第九十九页| 久久亚洲精品欧美| 欧美一区二区三区在线播放| 国产精品大片wwwwww| 亚洲香蕉伊综合在人在线视看| 亚洲人成毛片在线播放女女| 欧美va日韩va| 亚洲乱码久久| 日韩一本二本av| 欧美日韩欧美一区二区| 亚洲视频香蕉人妖| 亚洲天堂av图片| 国产欧美日韩在线播放| 久久精品国产清自在天天线| 久久大香伊蕉在人线观看热2| 国产一区二区高清不卡| 美国十次成人| 欧美区一区二| 欧美一级二级三级蜜桃| 久久久久一区二区三区| av成人动漫| 欧美亚洲免费高清在线观看| 亚洲电影有码| 国产精品99久久不卡二区| 国产欧美日韩亚洲| 欧美成人官网二区| 欧美日韩一区高清| 久久久福利视频| 欧美黄色aa电影| 久久精品一二三| 欧美日韩ab| 久久亚洲影院| 欧美日韩在线看| 麻豆久久婷婷| 国产精品伦一区| 亚洲国产成人久久综合一区| 国产精品欧美日韩| 亚洲国产日韩欧美在线动漫| 国产欧美视频一区二区三区| 亚洲国产美女久久久久| 国产精品网曝门| 91久久夜色精品国产九色| 国产午夜亚洲精品不卡| 亚洲精品久久嫩草网站秘色 | 国产精品久久久久久久午夜片| 久久三级视频| 欧美午夜精品久久久久久孕妇 | 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品第2页| 欧美激情在线免费观看| 国产九色精品成人porny| 亚洲国产日韩一区二区| 影音先锋在线一区| 亚洲欧美一区二区三区极速播放| 一区二区高清视频在线观看| 久久国产精品免费一区| aa亚洲婷婷| 免费一区二区三区| 久久国产精品免费一区| 欧美午夜激情视频| 亚洲欧洲一区二区天堂久久| 精品av久久707| 午夜亚洲伦理| 久久高清福利视频| 国产精品少妇自拍| 国产精品99久久久久久久vr| 一区二区免费在线观看| 蜜臀久久99精品久久久画质超高清 | 欧美日韩亚洲成人| 欧美成人伊人久久综合网| 国产在线一区二区三区四区| 亚洲曰本av电影| 在线中文字幕不卡| 欧美日韩国产精品一卡| 亚洲国产电影| 日韩视频在线观看一区二区| 免费观看国产成人| 欧美成人免费全部观看天天性色| 激情久久久久久| 久久久久久久一区二区| 久久综合给合| 国产尤物精品| 久久在线观看视频| 欧美不卡激情三级在线观看| 亚洲国产精品久久人人爱蜜臀| 欧美成人黑人xx视频免费观看| 亚洲国产天堂久久综合网| 亚洲美女黄色| 国产精品护士白丝一区av| 亚洲综合色视频| 久久亚洲欧美| 亚洲精品一区二区三区樱花| 欧美四级电影网站| 西瓜成人精品人成网站| 免费国产自线拍一欧美视频| 亚洲美女色禁图| 国产精品日韩欧美一区二区| 欧美影院成人| 亚洲精品社区| 久久精品视频亚洲| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美人成免费网站| 香蕉久久国产| 亚洲国产精品电影| 香蕉久久精品日日躁夜夜躁| 亚洲国产精品久久91精品| 欧美日韩亚洲激情| 欧美在现视频| 一本一本久久a久久精品牛牛影视| 欧美在线网站| 亚洲美女中出| 激情综合久久| 国产精品国产a| 毛片一区二区| 午夜免费久久久久| 亚洲欧洲一区二区三区久久| 久久精品视频网| 亚洲伊人久久综合| 亚洲国产片色| 国产一区二区三区高清播放| 欧美国产精品va在线观看| 亚洲午夜小视频| 欧美高清hd18日本| 欧美专区在线播放| 亚洲免费高清视频| 久久久夜色精品亚洲| 99精品国产高清一区二区| 国产一区亚洲一区| 欧美日韩国产在线| 老色鬼精品视频在线观看播放| 一本久久综合亚洲鲁鲁五月天| 美玉足脚交一区二区三区图片| 亚洲男人av电影| 9久re热视频在线精品| 黄色精品免费| 国产午夜精品视频| 欧美午夜免费| 欧美午夜国产|