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

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

Transparent Flash Control

Posted on 2008-09-11 22:13 沒(méi)畫(huà)完的畫(huà) 閱讀(4341) 評(píng)論(4)  編輯 收藏 引用 所屬分類(lèi): Windows COM

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

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

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

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

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

在DEMO里實(shí)現(xiàn)了一個(gè)OLE容器類(lèi)叫 COleContainerWnd
template<CLASS T>
class COleContainerWnd : virtual public IOleClientSite,
                         virtual public IOleInPlaceSiteWindowless, 
                         virtual public IOleInPlaceFrame,
                         virtual public IStorage

是個(gè)模板類(lèi),T是留給 ActiveX 的接口

Part 2
把 flash.ocx 引進(jìn)來(lái),因?yàn)槔锩姘薋lash播放器的相關(guān)接口定義,它就是我們要放到容器里的 ActiveX 對(duì)象了
#import "flash.ocx" named_guids 

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

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

CFlashWnd 對(duì)象的創(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ù)的第一個(gè)參數(shù):Flash 播放對(duì)象的ClassID
Create() 函數(shù)的第二個(gè)參數(shù):窗體的擴(kuò)展風(fēng)格 WS_EX_LAYERED ,據(jù)說(shuō)加了這個(gè)風(fēng)格才能實(shí)現(xiàn)透明 Flash ,為啥?
……

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

值得注意的是

OleCreate() 函數(shù)用來(lái)創(chuàng)建一個(gè) IOleObject 對(duì)象的實(shí)例,需要 把 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 對(duì)象跟它說(shuō),你已經(jīng)被嵌到 OLE 容器里了

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

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

要?jiǎng)?chuàng)建一個(gè)無(wú)窗口的控件,OLE容器需要  IOleInPlaceObjectWindowless 接口來(lái)分派消息給對(duì)象, 因?yàn)?對(duì)象本身沒(méi)有自己所屬的窗體
另外,IOleInPlaceObject 接口需要重出那個(gè)對(duì)象

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

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

Part 5.
透明窗體的重畫(huà)

1、創(chuàng)建窗體時(shí)加上 WS_EX_LAYERED 屬性
2、用 CreateDIBSection() 創(chuàng)建一個(gè) 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ù)重畫(huà)窗體

描繪 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 對(duì)象的事件是用IDispatch來(lái)處理的,在創(chuàng)建后得到一個(gè) IConnectionPointContainer 去獲取 DIID__IShockwaveFlashEvents 的 連接點(diǎn)(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
為了提交重畫(huà)的性能,所以使用 DirectDraw 接口
Flash對(duì)象通過(guò) ShockwaveFlashObjects::IServiceProvider::raw_RemoteQueryService 這個(gè)接口來(lái)訪問(wèn)它
(需要找一下 FlashObject 接口的文檔了解一下)


(眼睛睜不開(kāi),需要先睡一會(huì)………………)






Feedback

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

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

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

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

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

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

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

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

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            久久久久综合网| 亚洲精品网站在线播放gif| 亚洲一区二区动漫| 国产一区二区三区电影在线观看| 亚洲黄色免费电影| 国产精品99久久99久久久二8| 欧美美女操人视频| 中文av一区二区| 欧美华人在线视频| 久久久久久尹人网香蕉| 欧美~级网站不卡| 亚洲国产成人在线| 亚洲一区二区成人| 国产一区二区三区自拍| 浪潮色综合久久天堂| 亚洲国产精品悠悠久久琪琪| 亚洲视频在线观看| 激情久久久久久久| 欧美四级伦理在线| 久久久精品日韩| 一本色道久久综合| 女主播福利一区| 亚洲欧美中文日韩在线| 亚洲国产成人av| 国产精品户外野外| 欧美国产一区二区| 亚洲人成在线观看一区二区| 猛男gaygay欧美视频| 亚洲老司机av| 久久综合影视| 一本色道久久88精品综合| 国产亚洲精品aa午夜观看| 欧美视频1区| 久久视频在线看| 亚洲永久免费av| 亚洲国产成人精品视频| 女人色偷偷aa久久天堂| 久久av一区二区| 亚洲一区二区三区精品在线观看| 99国产麻豆精品| 亚洲第一在线综合在线| 亚洲国产精品第一区二区三区| 久久人人爽国产| 久久综合免费视频影院| 欧美激情2020午夜免费观看| 久久久久九九视频| 久久久久久夜| 欧美一区二区精美| 午夜精品久久久久久99热软件| 亚洲看片网站| 亚洲欧美国产高清| 亚洲午夜精品久久久久久app| 夜夜夜久久久| 欧美一区二区三区在线观看| 美国成人直播| 99精品视频一区| 亚洲经典在线| 欧美一级视频| 狂野欧美一区| 欧美freesex8一10精品| 欧美视频亚洲视频| 欧美日韩亚洲高清| 一区精品在线| 亚洲网站视频福利| 欧美夫妇交换俱乐部在线观看| 99精品黄色片免费大全| 小辣椒精品导航| 一区二区亚洲| 亚洲女人天堂成人av在线| 久久久久久久久蜜桃| 亚洲欧洲一区二区天堂久久| 一区二区三区精品视频| 欧美成人福利视频| 亚洲第一视频网站| 美女久久一区| 欧美在线二区| 国产精品一区二区女厕厕| 99这里只有精品| 免费观看一级特黄欧美大片| 亚洲男女自偷自拍| 欧美视频第二页| 中文久久精品| av成人免费在线| 国产精品99免视看9| 黄页网站一区| 久久综合激情| 久久午夜视频| 亚洲人成网站777色婷婷| 久久久97精品| 欧美gay视频| 亚洲美女av在线播放| 亚洲国产日韩欧美在线99| 欧美激情精品久久久久久变态| 91久久精品国产91性色| 亚洲乱码国产乱码精品精98午夜| 欧美激情综合网| 亚洲少妇自拍| 日韩视频一区二区三区| 国产精品www.| 美女视频黄 久久| 欧美日本国产精品| 欧美亚洲一区二区在线| 中文高清一区| 亚洲高清av在线| 欧美激情视频一区二区三区免费| 麻豆久久婷婷| 亚洲午夜av| 性欧美xxxx大乳国产app| 欧美精品在线观看播放| 久久国内精品自在自线400部| 午夜日韩在线| 亚洲一二三区在线观看| 免费高清在线视频一区·| 一本久道久久综合狠狠爱| 一区二区欧美视频| 激情欧美丁香| 亚洲嫩草精品久久| 一本久道久久综合婷婷鲸鱼| 亚洲一区区二区| 狠狠色丁香婷婷综合影院| 亚洲精品专区| 在线观看亚洲一区| 亚洲欧美激情一区二区| 99视频精品| 午夜亚洲福利| 亚洲尤物视频网| 老色鬼久久亚洲一区二区| 性欧美暴力猛交另类hd| 欧美精品aa| 99热免费精品| 一道本一区二区| 欧美激情久久久| 能在线观看的日韩av| 亚洲成人资源网| 欧美一区二区成人| 一区二区高清视频| 欧美精品免费视频| 日韩一级不卡| 午夜欧美大片免费观看| 欧美日韩国产区一| aa成人免费视频| 一区二区欧美在线观看| 欧美精品日韩| 亚洲一区视频在线观看视频| 亚洲欧美另类久久久精品2019| 欧美午夜一区二区| 亚洲欧美国产三级| 欧美国产欧美综合 | 欧美日韩国产免费| 91久久久在线| 亚洲精品影视在线观看| 欧美日韩精品中文字幕| 亚洲欧美日韩区| 另类图片国产| 宅男噜噜噜66一区二区| 国产精品自拍视频| 亚洲综合不卡| 亚洲激情视频网站| 国产精品久久久久aaaa| 久久精品论坛| 亚洲精品一区二区三区在线观看| 一区二区免费在线视频| 国产精品久久久久三级| 久久精品亚洲一区| 中文日韩电影网站| 亚洲电影成人| 欧美在线一二三| 亚洲色无码播放| 亚洲日本va在线观看| 欧美日韩一二三四五区| 久久久久久九九九九| 亚洲桃色在线一区| 亚洲国产日韩在线| 欧美福利视频| 欧美大片免费久久精品三p| 亚洲综合另类| 一本色道久久综合亚洲精品不 | 136国产福利精品导航网址| 噜噜噜在线观看免费视频日韩| 欧美在线观看一区| 亚洲一区二区视频| 一本色道久久综合亚洲精品婷婷| 亚洲国产欧美一区| 亚洲第一区色| 亚洲国产精品123| 久久久人成影片一区二区三区 | 国产日韩欧美三级| 欧美婷婷六月丁香综合色| 久久精品一区中文字幕| 亚洲综合首页| 一区二区三区成人| 亚洲日本激情| 一本色道久久综合| 亚洲综合首页| 久久精品国产一区二区三区免费看| 亚洲一区中文| 久久久一本精品99久久精品66| 久久久国产精彩视频美女艺术照福利 | 久久一区二区三区四区五区| 夜夜嗨av一区二区三区|