游民家园

leafyoung v.s. dotnet

导航

[ATL/ActiveX]全屏显示ActiveX控件

现在很多视频共享网站如土豆等都使用flash控件作为播放器界面,而利用flash实现全屏非常简单,只要把fullscreen属性设置为true即可,其他的播放器如mediaplayer等都有类似实现全屏效果的属性,但是怎么在自定义的ActiveX控件实现这种效果呢?基本的实现其实比较简单,网上也有不少例子,不过大都有bug。下面是我修改得到的一个实现,效果还算不错,原理比较简单,就不废话了。

if (m_bFullScreen)
{
    LockWindowUpdate(TRUE);

    ::SetParent(m_hWnd, m_OldWndParent);
    SetWindowPlacement(
&m_OldWndPlacement);

    ::SetForegroundWindow(m_OldWndParent);  
    ::SetFocus(m_OldWndParent);
    ::SetFocus(m_hWnd);

    LockWindowUpdate(FALSE);
}
else
{
    GetWindowPlacement(
&m_OldWndPlacement);
    
int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
    
int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);

    m_OldWndParent 
= ::GetParent(m_hWnd);
    ::SetParent(m_hWnd, GetDesktopWindow());

    WINDOWPLACEMENT wp1;
    ZeroMemory(
&wp1, sizeof(WINDOWPLACEMENT));
    wp1.length 
= sizeof(WINDOWPLACEMENT);
    wp1.showCmd 
= SW_SHOWNORMAL;
    wp1.rcNormalPosition.left 
= 0;
    wp1.rcNormalPosition.top 
= 0;
    wp1.rcNormalPosition.right 
= nScreenWidth;
    wp1.rcNormalPosition.bottom 
= nScreenHeight;
    SetWindowPlacement(
&wp1);

    ::SetForegroundWindow(GetDesktopWindow());
    ::SetForegroundWindow(m_hWnd);
}

m_bFullScreen 
= !m_bFullScreen;

上面代码纠正了网上能找到的代码中一个比较明显的焦点切换的问题,纯粹是我多次实验的结果,不要问我为什么这么写。

当然,这段代码也是有问题的,而且相当奇怪,在"ActiveX Control Test Container"中运行一切正常,但是一旦把这个控件嵌入的网页后,全屏,切回,改变IE窗口大小,再试图全屏就不会成功了,而是只有左上角有显示,结果比较诡异:



没有什么头绪,如果有人知道的话,赐教^_^

posted on 2007-10-16 18:56  游民一族  阅读(5085)  评论(11编辑  收藏  举报