在做夸浏览器控件时,遇到全屏问题。
基于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();