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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 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;
}
复制代码


目录
相关文章
|
7天前
|
弹性计算 运维 Kubernetes
实践篇:灵活调度,高效编排,容器化管理云上应用
【7月更文第8天】阿里云容器服务Kubernetes版(ACK)作为业界领先的容器管理和编排服务,凭借其强大的技术实力和丰富的云服务生态,为企业级用户提供了一系列卓越的优势,助力现代化应用的快速构建、部署与运维。
16 1
|
10天前
|
存储 Kubernetes 负载均衡
云端应用容器化管理:全面深入评测与分析
阿里云ACK测评:提供一键式容器应用部署,集成ALB实现高效交付,但一键部署有时故障且高级配置需专业知识。操作界面直观,文档全面但对Helm等进阶主题指导不足。适合已有Kubernetes基础的用户,对于新手可能挑战较大。推荐给寻求云上容器管理解决方案的企业。
云端应用容器化管理:全面深入评测与分析
|
2天前
|
弹性计算 运维 负载均衡
解决方案评测|容器化管理云上应用
解决方案评测|容器化管理云上应用
|
8天前
|
Kubernetes Devops 持续交付
容器化技术在DevOps中的应用
【7月更文挑战第6天】容器化技术在DevOps中的应用极大地提高了软件开发的效率和可靠性。通过自动化部署、持续集成与持续交付、环境一致性以及资源管理和监控等功能,容器化技术为开发人员和运维人员提供了更加便捷、高效的管理和部署方式。随着云计算技术的不断发展和普及,容器化技术将在DevOps中发挥越来越重要的作用。
|
6天前
|
存储 运维 监控
容器化技术在现代运维中的应用与挑战
【7月更文挑战第9天】在数字化转型的浪潮中,容器化技术以其轻量级、可移植和易于管理的特性成为DevOps实践的重要工具。本文深入探讨了容器化技术如何革新现代运维工作,同时指出实施过程中可能遇到的挑战,包括安全性问题、存储限制和网络配置复杂性等,旨在为运维团队提供应对策略。
|
7天前
|
Kubernetes Cloud Native 微服务
企业级容器部署实战:基于ACK与ALB灵活构建云原生应用架构
这篇内容概述了云原生架构的优势,特别是通过阿里云容器服务Kubernetes版(ACK)和应用负载均衡器(ALB)实现的解决方案。它强调了ACK相对于自建Kubernetes的便利性,包括优化的云服务集成、自动化管理和更强的生态系统支持。文章提供了部署云原生应用的步骤,包括一键部署和手动部署的流程,并指出手动部署更适合有技术背景的用户。作者建议在预算允许的情况下使用ACK,因为它能提供高效、便捷的管理体验。同时,文章也提出了对文档改进的建议,如添加更多技术细节和解释,以帮助用户更好地理解和实施解决方案。最后,展望了ACK未来在智能化、安全性与边缘计算等方面的潜在发展。水文一篇,太忙了,见谅!
|
10天前
|
Kubernetes 调度 云计算
容器化管理云上应用的解决方案
我对阿里云ACK和ALB的容器化应用管理能力印象深刻。它们不仅提供了强大的功能,还拥有易于使用的界面和丰富的文档支持。我强烈推荐其他开发者和企业尝试这些服务,它们将极大地提升你的云上应用管理效率。
15 1
|
12天前
|
运维 Kubernetes Docker
容器化技术在微服务架构中的应用
【7月更文挑战第3天】容器化技术在微服务架构中的应用,为现代应用的开发、部署和运维带来了革命性的变化。通过容器化,我们可以实现服务的快速部署、独立运行和高效扩展,同时提高资源的利用率和系统的可维护性。随着容器技术的不断发展和完善,相信它将在未来的软件开发中发挥更加重要的作用。
|
6天前
|
运维 监控 Kubernetes
容器化技术在现代运维中的应用与挑战
【7月更文挑战第9天】 在数字化浪潮的推动下,容器化技术已成为软件开发和运维领域的革命性进步。本文将深入探讨容器化技术如何重塑运维工作模式,分析其在提高部署效率、优化资源利用等方面的显著优势,并讨论在安全性、监控与管理等方面所面临的挑战。通过具体案例分析,我们将揭示容器化技术在实际运维中的最佳实践,为读者提供一手的运维洞见和实用策略。
|
7天前
|
存储 运维 监控
容器化技术在现代运维中的应用与挑战
【7月更文挑战第8天】随着云计算技术的飞速发展,容器化技术已经成为现代运维不可或缺的一部分。本文将深入探讨容器化技术的基本概念、核心优势以及在运维领域的实际应用案例,同时分析在部署和管理过程中可能遇到的挑战和解决方案,旨在为运维人员提供一份全面的容器化应用指南。
6 0