内嵌Activex的Activex插件开发

介绍:   如今在许多流媒体视频网站(youku,tudou......)我们都会发现,观看视频之前都会有一段时间的广告,甚至在观看视频途中也会插入一些 广告。实现这个效果的可以有多种技术。使用Javascript就可以实现,只需要在同一个位置分别创建两个Object,一个嵌入Flash插件,一个 嵌入 WMP插件,然后切换显示这两个控件即可。   使用COM/Activex技术也可以在同一个控件中实现这样的功能。 插件功能描述:   上周在某个公司碰到这么一个问题,它们需要创建一个插件,内部嵌入一个Flash插件和Windows Media Player插件。然后写一个Web测试页面测试此Activex页面。页面上有三个输入框和一个按钮(Play)。第一个输入框输入falsh URL(.swf),第二个输入框输入.swf播放时间长度(秒),即视频广告时间,第三个输入框输入.wmv URL。点击Play按钮后,页面按钮将三个参数传递给控件,控件优先播放.swf,要布满整个控件的大小。.swf播放指定的时间之后,然后播 放.wmv,wmv也要布满整个控件。

容器-插件基础:

为在一个窗口中嵌入一个Activex的话,就需要创建一个Container Window,然后创建被嵌入的Activex,然后通过上述的接口建立容器与Activex直接的联系。在ATL中使用CAxHostWindow封装 了Activex容器,并进一步使用CAxWindow类来简化控件容器的操作。 Activex嵌入主要代码 1.内嵌Activex的创建

LRESULT CEmbed::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)  
{  
    RECT rc;  
    GetWindowRect(&rc);  
    rc.right -= rc.left;  
    rc.bottom -= rc.top;  
    rc.top = rc.left = 0;  
 //对于ATL3.0 必须调用AtlAxWinInit,否则Create会调用失败 
    AtlAxWinInit(); //初始化容器窗口的注册类 
    RECT rect = rc;  
 //创建Shock wave flash控件播放Flash 
 TCHAR* controlName = L"ShockwaveFlash.ShockwaveFlash";  
    m_FlashWin.Create(m_hWnd, rect, controlName, WS_CHILD | WS_VISIBLE, 0, ID_FLASHCTRL );  
 DWORD  error = ::GetLastError();  
    CComPtr< IAxWinAmbientDispatch > ambient;  
    m_FlashWin.QueryHost( &ambient );  
    CComPtr<IAxWinHostWindow> hostwin;  
    m_FlashWin.QueryHost(&hostwin);  
    hostwin->QueryControl(__uuidof(IDispatch),(void**)&m_ptrFlash.p);  
    CComQIPtr<IShockwaveFlash> ptrFlash = m_ptrFlash;  
    ptrFlash->put_BackgroundColor(RGB( 0, 0, 0 ) );  
 //创建Windows Media Play控件播放.wmv文件 
    controlName = L"WMPlayer.OCX";  
 //CLSID cld; 
 //::CLSIDFromProgID(controlName,&cld); 
    m_WmvWin.Create(m_hWnd, rect,controlName,WS_CHILD, 0,ID_WMPCTRL);  
 if(hostwin)  
        hostwin.Release();  
    m_WmvWin.QueryHost(&hostwin);  
    hostwin->QueryControl(__uuidof(IDispatch),(void**)&m_ptrWmv.p);      
 return 0;  
}  

2.设置内嵌Activex控件的大小位置

HRESULT CEmbed::SetObjectRects(LPCRECT prcPos,LPCRECT prcClip)  
{  
    IOleInPlaceObjectWindowlessImpl<CEmbed>::SetObjectRects(prcPos, prcClip);  
 int cx, cy;  
    cx = prcPos->right - prcPos->left;  
    cy = prcPos->bottom - prcPos->top;  
    RECT rect;  
    GetClientRect( &rect );  
    rect.top = 0;  
    rect.left = 0;  
 if(m_FlashWin)  
        m_FlashWin.MoveWindow(&rect );  
 if(m_FlashWin)  
        m_WmvWin.MoveWindow(&rect );  
 return S_OK;  
}  

3.测试代码

<HTML> 
<HEAD> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/> 
<TITLE>内嵌Activex的Activex插件测试页</TITLE> 
</HEAD> 
<BODY> 
<OBJECT ID="Play" CLASSID="CLSID:62762BB2-C5D5-4CAC-A17C-CABC660678F2" width=700 height=400 ></OBJECT> 
<br>Flash URL:<input type=text size=45 id="urlflash" value="http://www.atfriday.com/GameZone/200471922656/20047198816907.swf"> 
Time:<input type=text size=3 id="elapse" value=5> 
<br>WMV URL:  <input type=text size=45 id="wmvflash" value="D://test//Embed//Embed//wmp.wmv"> 
<input type=button value="Play" onclick="play()"> 
<mce:script language="javascript" type="text/javascript"><!--  
function play()  
{  
    var obj;      
    var palyobj = document.getElementById("Play");  
 obj = document.getElementById("urlflash");  
    palyobj.LoadFlashMovie(obj.value);      
 obj = document.getElementById("wmvflash");  
    palyobj.LoadWmvMovie(obj.value);  
 obj = document.getElementById("elapse");  
    palyobj.SetJmpTimer(parseInt(obj.value));  
    palyobj.Play();  
}  
// --></mce:script> 
</BODY> 
</HTML> 

源代码下载 http://files.cnblogs.com/tttyd/Activex.rar

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

10款实用Android UI 开发框架

1. ActionBarSherlock ActionBarSherlock是一个独立的Android设计库,可以让Android 2.x的系统也能使用Acti...

5547
来自专栏有趣的django

博客园美化终极版-(自定义导航栏)----什么CSDN、简书、腾讯云专栏、个人博客和微信公众号都弱爆了

7400
来自专栏君赏技术博客

百思不得姐数据挖掘第三篇

播放视频的界面现在只剩下视频的功能了,对于这种播放视频的应该属于功能块。我们可以单独把这个功能提取出来。

1392
来自专栏张善友的专栏

在OpenOffice.org和微软Office之间共享文档

原文:Sharing files between OpenOffice.org and Microsoft Office。翻译可能也比较随意。 本文版权请向原文...

2167
来自专栏Python中文社区

用Python爬取东方财富网上市公司财务报表

摘要: 现在很多网页都采取JavaScript进行动态渲染,其中包括Ajax技术。有的网页虽然也用Ajax技术,但接口参数可能是加密的无法直接获得,比如淘宝;有...

1.6K3
来自专栏向治洪

iOS开发入门笔记

iOS开发入门笔记 本文面向已有其它语言(如Java,C,PHP,Javascript)编程经验的iOS开发初学者,初衷在于让我的同事一小时内了解如何开始开发i...

4606
来自专栏跟着阿笨一起玩NET

C#自定义开关按钮控件--附带第一个私活项目截图

进入智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ、360卫士、金山毒霸等,都有很多开关控制一些操...

2601
来自专栏张戈的专栏

JS代码实现浏览器网页标题的动态切换,略微提高网站粘性

前几天在微饭天空看到一个让我眼前一亮的分享,自己拿过来用了几天之后,感觉挺有意思,现在我略微改进一下并分享出来,方便更多人自定义成自己喜欢的内容。 ? 一、原...

4034
来自专栏xx_Cc的学习总结专栏

iOS-世界那么大,CoreLocation带你去看看

3009
来自专栏hbbliyong

WPF中播放声音媒体文件

这段时间我们小组要给部门的Annual Meeting準备一个WPF的抽奖程序,为了增加程序的有趣性,我们在程序中需要播放背景音乐等。由於对之前从未使用过WPF...

4576

扫码关注云+社区

领取腾讯云代金券