ActiveX控件 全屏彻底实现,支持IE 和 应用程序

来源:互联网 发布:可乐vicky软件 写真 编辑:程序博客网 时间:2024/05/04 10:02


在做夸浏览器控件时,遇到全屏问题。

基于ATL 开发的ACTIVEX控件,在应用程序VC 可以全屏,但在IE不能全屏,

基于MFC 开发的ACTIVEX控件,在IE 可以全屏,可以在应用程序却不能全屏,这个问题折腾了我快一周,几乎崩溃。

功夫不负有心人,最终解决了。及支持IE 也支持应用程序。网上没找到一个能实现的。怪!

关键需要增加一个控件,不能用控件窗口实现全屏(微软有限制),在增加的控件中处理消息

全屏后,还要处理视频显示问题,这个也折腾了半天

 .h

 HWND m_videoWnd;
 bool m_bFullScreen;
 HWND m_OldWndParent;
 WINDOWPLACEMENT m_OldWndPlacement;
 static LRESULT CALLBACK WindowEventProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 static WNDPROC m_pOldWndProc;
 typedef map<HWND, CFullActiveXCtrl*> CVideoWndMap;
 static CVideoWndMap m_VideoWndMap;
 CStatic m_video;

 void SetFullScreen(void);

 

 afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

.cpp:

CFullActiveXCtrl::CVideoWndMap CFullActiveXCtrl::m_VideoWndMap;
WNDPROC CFullActiveXCtrl::m_pOldWndProc = NULL;
//构造函数

 m_bFullScreen = false;
void CFullActiveXCtrl::SetFullScreen(void)
{
 m_bFullScreen = !m_bFullScreen;
 HWND hWnd = m_videoWnd;
 if (m_bFullScreen)
 {
   m_OldWndPlacement.length = sizeof(WINDOWPLACEMENT);
   ::GetWindowPlacement(hWnd,&m_OldWndPlacement);
  int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
  int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
  m_OldWndParent = ::GetParent(hWnd);

  HWND hDesk = ::GetDesktopWindow();
  m_OldWndParent = ::SetParent(hWnd, hDesk);
  
  WINDOWPLACEMENT wp1;
  ZeroMemory(&wp1, sizeof(WINDOWPLACEMENT));
  wp1.length = sizeof(WINDOWPLACEMENT);
  wp1.showCmd = SW_SHOWMAXIMIZED;
  wp1.rcNormalPosition.left = 0;
  wp1.rcNormalPosition.top = 0;
  wp1.rcNormalPosition.right = nScreenWidth;
  wp1.rcNormalPosition.bottom = nScreenHeight;
  ::SetWindowPlacement(hWnd,&wp1);
  ::SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

  ::SetForegroundWindow(::GetDesktopWindow());
  ::SetForegroundWindow(hWnd);
 }
 else
 {
  LockWindowUpdate();
  ::SetParent(hWnd, m_hWnd);
  ::SetWindowPlacement(hWnd,&m_OldWndPlacement);
  ::SetForegroundWindow(hWnd); 
  ::SetFocus(hWnd);

  UnlockWindowUpdate();
 }
 
 return ;
}

//创建视频显示窗口,也是全屏的窗口
int CFullActiveXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (COleControl::OnCreate(lpCreateStruct) == -1)
  return -1;

 CRect rc;
 GetClientRect(&rc);

 m_video.Create(_T(""),WS_CHILD|WS_VISIBLE|SS_NOTIFY,rc,this);
 m_videoWnd = m_video.GetSafeHwnd();
 m_pOldWndProc = reinterpret_cast<WNDPROC>(::SetWindowLong(m_videoWnd, GWL_WNDPROC, reinterpret_cast<LONG>(WindowEventProc)));

//避免多个控件出现问题
 m_VideoWndMap[m_videoWnd] = this;

 return 0;
}

LRESULT CALLBACK CFullActiveXCtrl::WindowEventProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

 CVideoWndMap::iterator it = m_VideoWndMap.find(hWnd);
 CFullActiveXCtrl* pThis = it->second;
 if (pThis && hWnd == pThis->m_videoWnd)
 {
  switch (uMsg)
  {
   case WM_LBUTTONDBLCLK:
   {
    pThis->SetFullScreen();
    return TRUE;
   }
   case WM_CLOSE://全屏时禁止ALT+F4
    return TRUE;

   case WM_PAINT:
    {
     ::ValidateRect(hWnd, NULL);
    }

   case WM_ERASEBKGND: //显示视频需要 XP 
    {
     CRect rect;
     ::GetClientRect(hWnd,&rect);
     pThis->m_video.GetDC()->FillSolidRect(&rect, RGB(1,0,1));
     return TRUE;
    }
  }
 }

 return CallWindowProc(CFullActiveXCtrl::m_pOldWndProc, hWnd, uMsg, wParam, lParam);
}
//析构

 m_video.DestroyWindow();

0 0
原创粉丝点击