【译】用于多媒体应用的无窗口ATL ActiveX控件容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
原文链接:ATL Windowless ActiveX Media Container

      这个ATL activeX框架适用于作为Windows Media Player,Flash以及Sliverlight动画的承载容器。整个框架分布在Windowless文件夹下,共有6个文件。架构如图所示:



使用Adobe Flash Player作为子控件

 

主要代码如下:

复制代码
class CMainDlg : public CAxWindowlessHost<CMainDlg>


LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    // center the dialog on the screen
    CenterWindow();

    // set icons
    HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
    SetIcon(hIcon, TRUE);
    HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
    SetIcon(hIconSmall, FALSE);

    TCHAR szPath[MAX_PATH] = { 0 };
    if ( ::GetModuleFileName(NULL, szPath, MAX_PATH) > 0 )
    {//定位.swf文件
        LPTSTR pszSep = _tcsrchr(szPath, TCHAR('\\'));
        pszSep++;
        *pszSep = 0;
        ::StringCchCat(szPath, MAX_PATH, _T("Construction.swf"));
    }

    // Initialize Flash Player (Shockwave .swf)
    HRESULT hr;
    ActiveXSite* pSite;
    pSite = CAxWindowlessHost<CMainDlg>::GetControlSite(IDC_SHOCKWAVEFLASH);//获取flash player子控件
    if ( pSite != NULL )
    {
        CComQIPtr<IShockwaveFlash> spFlash = pSite->ActiveXControl();
        hr = spFlash->put_WMode( CComBSTR("Transparent") );//设置“透明”
        hr = spFlash->put_Movie( CComBSTR(szPath) );//设置影片源文件
    }
    return TRUE;
}
复制代码
使用Windows Meida Player作为子控件

 

主要代码如下:

复制代码
LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    // center the dialog on the screen
    CenterWindow();

    // set icons
    HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
    SetIcon(hIcon, TRUE);
    HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
    SetIcon(hIconSmall, FALSE);

    // Initialize Windows Media Player
    HRESULT hr;
    ActiveXSite* pSite;
    pSite = CAxWindowlessHost<CMainDlg>::GetControlSite(IDC_WMP11);//获取Meida Player子控件
    if ( pSite != NULL )
    {
        pSite->SetAllowResize(false);//不允许自动调整大小
        CComQIPtr<IWMPCore> wmp = pSite->ActiveXControl();
        CComQIPtr<IWMPPlayer4> wmp4 = pSite->ActiveXControl();
        // this can be done manually as well
        if ( wmp4 ) 
        {
            hr = wmp4->put_windowlessVideo( VARIANT_TRUE );//无窗口模式
            //hr = wmp4->put_uiMode( CComBSTR("Full") );//填充模式
        }
        //hr = wmp->put_URL( CComBSTR("c:\\temp\\videofile.wmv") );//多媒体文件地址
    }

    return TRUE;
}

LRESULT CMainDlg::OnBnClickedBtnBrowse(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{//选择多媒体文件
    static LPCTSTR pszFilter = _T("Video Files (*.avi;*.mpg;*.wmv)\0*.avi;*.mpg;*.wmv\0\0");
    CFileDialog fileOpen(TRUE, _T("avi"), NULL,
        OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, pszFilter/*, m_hWnd*/);
    if ( IDOK == fileOpen.DoModal() )
    {
        ActiveXSite* pSite;
        pSite = CAxWindowlessHost<CMainDlg>::GetControlSite(IDC_WMP11);
        SetDlgItemText(IDC_TXT_FILENAME,  fileOpen.m_szFileName);
        CComQIPtr<IWMPPlayer4> wmp4 = pSite->ActiveXControl();
        wmp4->close();
        wmp4->put_URL( CComBSTR( fileOpen.m_szFileName ) );
    }

    return 0;
}
复制代码
 使用Sliverlight作为子控件

 

主要代码如下:

复制代码
LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    // center the dialog on the screen
    CenterWindow();

    // set icons
    HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
    SetIcon(hIcon, TRUE);
    HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
    SetIcon(hIconSmall, FALSE);

    // Initialize Silverlight Control (this is not windowless but cool anyway)
    HRESULT hr;
    ActiveXSite* pSite;
    pSite = CAxWindowlessHost<CMainDlg>::GetControlSite(IDC_AGCONTROL1);//获取SliverLight子控件
    if ( pSite != NULL )
    {
        // disable right-click!
        pSite->SetAllowRClick(false);//禁止掉右键
        // load from URL
        //CComBSTR bstrUrl("file:///c:\\temp\\SortTheFootbars.xap");
        CComBSTR bstrUrl("http://www.andybeaulieu.com/silverlight/2.0/sortthefoobars/ClientBin/SortTheFoobars.xap");
        pSite->SetUrl(bstrUrl);//设置多媒体源文件
        CComQIPtr<IXcpControl2> slight = pSite->ActiveXControl();
        hr = slight->put_Source(bstrUrl);
    }
    return TRUE;
}
复制代码

原文链接:ATL Windowless ActiveX Media Container

      这个ATL activeX框架适用于作为Windows Media Player,Flash以及Sliverlight动画的承载容器。整个框架分布在Windowless文件夹下,共有6个文件。架构如图所示:

使用Adobe Flash Player作为子控件

 

主要代码如下:

复制代码
class  CMainDlg :  public  CAxWindowlessHost < CMainDlg >


LRESULT CMainDlg::OnInitDialog(UINT 
/* uMsg */ , WPARAM  /* wParam */ , LPARAM  /* lParam */ , BOOL &   /* bHandled */ )
{
    
//  center the dialog on the screen
    CenterWindow();

    
//  set icons
    HICON hIcon  =  (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
    SetIcon(hIcon, TRUE);
    HICON hIconSmall 
=  (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
    SetIcon(hIconSmall, FALSE);

    TCHAR szPath[MAX_PATH] 
=  {  0  };
    
if  ( ::GetModuleFileName(NULL, szPath, MAX_PATH)  >   0  )
    {
// 定位.swf文件
        LPTSTR pszSep  =  _tcsrchr(szPath, TCHAR( ' \\ ' ));
        pszSep
++ ;
        
* pszSep  =   0 ;
        ::StringCchCat(szPath, MAX_PATH, _T(
" Construction.swf " ));
    }

    
//  Initialize Flash Player (Shockwave .swf)
    HRESULT hr;
    ActiveXSite
*  pSite;
    pSite 
=  CAxWindowlessHost < CMainDlg > ::GetControlSite(IDC_SHOCKWAVEFLASH); // 获取flash player子控件
     if  ( pSite  !=  NULL )
    {
        CComQIPtr
< IShockwaveFlash >  spFlash  =  pSite -> ActiveXControl();
        hr 
=  spFlash -> put_WMode( CComBSTR( " Transparent " ) ); // 设置“透明”
        hr  =  spFlash -> put_Movie( CComBSTR(szPath) ); // 设置影片源文件
    }
    
return  TRUE;
}
复制代码

使用Windows Meida Player作为子控件

 

主要代码如下:

复制代码
LRESULT CMainDlg::OnInitDialog(UINT  /* uMsg */ , WPARAM  /* wParam */ , LPARAM  /* lParam */ , BOOL &   /* bHandled */ )
{
    
//  center the dialog on the screen
    CenterWindow();

    
//  set icons
    HICON hIcon  =  (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
    SetIcon(hIcon, TRUE);
    HICON hIconSmall 
=  (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
    SetIcon(hIconSmall, FALSE);

    
//  Initialize Windows Media Player
    HRESULT hr;
    ActiveXSite
*  pSite;
    pSite 
=  CAxWindowlessHost < CMainDlg > ::GetControlSite(IDC_WMP11); // 获取Meida Player子控件
     if  ( pSite  !=  NULL )
    {
        pSite
-> SetAllowResize( false ); // 不允许自动调整大小
        CComQIPtr < IWMPCore >  wmp  =  pSite -> ActiveXControl();
        CComQIPtr
< IWMPPlayer4 >  wmp4  =  pSite -> ActiveXControl();
        
//  this can be done manually as well
         if  ( wmp4 ) 
        {
            hr 
=  wmp4 -> put_windowlessVideo( VARIANT_TRUE ); // 无窗口模式
            
// hr = wmp4->put_uiMode( CComBSTR("Full") ); // 填充模式
        }
        
// hr = wmp->put_URL( CComBSTR("c:\\temp\\videofile.wmv") ); // 多媒体文件地址
    }

    
return  TRUE;
}

LRESULT CMainDlg::OnBnClickedBtnBrowse(WORD 
/* wNotifyCode */ , WORD  /* wID */ , HWND  /* hWndCtl */ , BOOL &   /* bHandled */ )
{
// 选择多媒体文件
     static  LPCTSTR pszFilter  =  _T( " Video Files (*.avi;*.mpg;*.wmv)\0*.avi;*.mpg;*.wmv\0\0 " );
    CFileDialog fileOpen(TRUE, _T(
" avi " ), NULL,
        OFN_HIDEREADONLY 
|  OFN_OVERWRITEPROMPT, pszFilter /* , m_hWnd */ );
    
if  ( IDOK  ==  fileOpen.DoModal() )
    {
        ActiveXSite
*  pSite;
        pSite 
=  CAxWindowlessHost < CMainDlg > ::GetControlSite(IDC_WMP11);
        SetDlgItemText(IDC_TXT_FILENAME,  fileOpen.m_szFileName);
        CComQIPtr
< IWMPPlayer4 >  wmp4  =  pSite -> ActiveXControl();
        wmp4
-> close();
        wmp4
-> put_URL( CComBSTR( fileOpen.m_szFileName ) );
    }

    
return   0 ;
}
复制代码

 使用Sliverlight作为子控件

 

主要代码如下:

复制代码
LRESULT CMainDlg::OnInitDialog(UINT  /* uMsg */ , WPARAM  /* wParam */ , LPARAM  /* lParam */ , BOOL &   /* bHandled */ )
{
    
//  center the dialog on the screen
    CenterWindow();

    
//  set icons
    HICON hIcon  =  (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
    SetIcon(hIcon, TRUE);
    HICON hIconSmall 
=  (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
    SetIcon(hIconSmall, FALSE);

    
//  Initialize Silverlight Control (this is not windowless but cool anyway)
    HRESULT hr;
    ActiveXSite
*  pSite;
    pSite 
=  CAxWindowlessHost < CMainDlg > ::GetControlSite(IDC_AGCONTROL1); // 获取SliverLight子控件
     if  ( pSite  !=  NULL )
    {
        
//  disable right-click!
        pSite -> SetAllowRClick( false ); // 禁止掉右键
        
//  load from URL
        
// CComBSTR bstrUrl("file: // /c:\\temp\\SortTheFootbars.xap");
        CComBSTR bstrUrl( " http://www.andybeaulieu.com/silverlight/2.0/sortthefoobars/ClientBin/SortTheFoobars.xap " );
        pSite
-> SetUrl(bstrUrl); // 设置多媒体源文件
        CComQIPtr < IXcpControl2 >  slight  =  pSite -> ActiveXControl();
        hr 
=  slight -> put_Source(bstrUrl);
    }
    
return  TRUE;
}
复制代码


目录
相关文章
|
1月前
|
运维 Java Go
Go语言基础及其在容器化应用中的优势
【2月更文挑战第23天】本文首先介绍了Go语言的基本特性和优势,然后详细阐述了Go语言在容器化应用中的重要作用和独特优势。通过深入分析Go语言的语法简洁性、并发处理能力和内存管理特性,以及Docker容器技术的轻量级、可移植性和版本控制特点,本文旨在说明Go语言与Docker容器技术的结合能够显著提升应用的开发效率和部署灵活性,为现代软件开发和运维带来革命性的变革。
|
14天前
|
JSON Kubernetes Go
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
25 0
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
|
1月前
|
存储 安全 算法
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
49 1
|
1月前
|
边缘计算 Kubernetes 负载均衡
容器编排技术在云计算中的应用
随着云计算技术的飞速发展,容器编排技术作为一种重要的部署和管理工具,正在逐渐成为云计算领域的热门话题。本文将介绍容器编排技术在云计算中的应用,探讨其在提高应用程序部署效率、资源利用率以及系统可靠性方面的优势,并分析其未来发展趋势。
|
1月前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。
|
1月前
|
存储 Kubernetes 云计算
云计算基础与实战:从虚拟机到容器化应用
云计算基础与实战:从虚拟机到容器化应用
32 0
|
2月前
|
NoSQL Redis Docker
深入浅出:使用Docker容器化改进Python应用部署
在快速演进的软件开发领域,持续集成和持续部署(CI/CD)已成为加速产品上市的关键。本文将探索如何利用Docker,一种流行的容器化技术,来容器化Python应用,实现高效、可靠的部署流程。我们将从Docker的基本概念入手,详细讨论如何创建轻量级、可移植的Python应用容器,并展示如何通过Docker Compose管理多容器应用。此外,文章还将介绍使用Docker的最佳实践,帮助开发者避免常见陷阱,优化部署策略。无论是初学者还是有经验的开发人员,本文都将提供有价值的见解,助力读者在自己的项目中实现容器化部署的转型。
|
2月前
|
运维 Java 开发者
深入浅出:使用Docker容器化改善Java应用的部署与运维
在当今快速迭代的软件开发周期中,确保应用的一致性、可移植性与易于管理成为了开发与运维团队面临的重大挑战。本文旨在介绍如何通过Docker容器技术,有效地解决这些问题,特别是针对Java应用。我们将从Docker的基本概念出发,逐步深入到实际操作,展示如何将传统的Java应用容器化,以及这一过程如何帮助简化部署流程、提高应用的可靠性和可伸缩性。不同于常规的技术文章,本文试图以一种更加易于理解和实践的方式,让读者能够快速掌握容器化技术,并将其应用于日常的开发与运维工作中。
93 0
|
2月前
|
JavaScript NoSQL Redis
深入浅出:使用 Docker 容器化部署 Node.js 应用
在当今快速发展的软件开发领域,Docker 作为一种开源的容器化技术,已经成为了提高应用部署效率、实现环境一致性和便于维护的关键工具。本文将通过一个简单的 Node.js 应用示例,引导读者从零开始学习如何使用 Docker 容器化技术来部署应用。我们不仅会介绍 Docker 的基本概念和操作,还会探讨如何构建高效的 Docker 镜像,并通过 Docker Compose 管理多容器应用。此外,文章还将涉及到一些最佳实践,帮助读者更好地理解和应用 Docker 在日常开发和部署中的强大功能。
101 0
|
2月前
|
运维 Java Linux
深入解析:使用Docker容器化技术提升Java应用的部署效率
在快速迭代的软件开发周期中,如何保证应用的快速、一致和可靠部署成为了开发团队需要面对的重大挑战。本文将探讨如何利用Docker容器化技术,结合Java应用,实现高效、一致的部署流程。我们将从Docker的基本概念出发,详细介绍将Java应用容器化的步骤,包括创建Dockerfile、构建镜像以及运行容器等关键环节,并通过示例代码加以说明。此外,本文还将讨论在使用Docker部署Java应用时可能遇到的常见问题及其解决策略,旨在为读者提供一种提升部署效率、优化开发流程的有效方法。
303 2