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();
- ActiveX控件 全屏彻底实现,支持IE 和 应用程序
- ActiveX控件全屏显示
- IE下使用控件实现网页全屏
- ie开启 activex 控件
- bcb彻底删除activex控件
- IE 使用VLC ActiveX全屏播放技术
- 支持IE和Firefox的日历控件
- ATL 支持ActiveX控件开发的所实现的接口
- IE中的activex控件使用
- ie中的activex控件使用
- IE不加载ActiveX控件
- 使用ActiveX控件建立应用程序
- 让Firefox支持ActiveX控件
- 多浏览器支持ActiveX控件
- flash全屏在Activex控件上和在Google chrome插件上的区别
- 非IE内核浏览器支持activex插件
- 非IE内核浏览器支持activex插件
- 非IE内核浏览器支持activex插件
- LEETCODE-Kth Smallest Element in a BST
- BestCoder Round #63 (div.2) HDOJ5568 sequence2(dp + 大数)
- 九度oj-1516-调整数组顺序使奇数位于偶数前面
- 正常编写的程序出现androidmainfest.xml missing错误怎么做
- [UVA11922]Permutation Transformer(splay树的序列分裂旋转应用)
- ActiveX控件 全屏彻底实现,支持IE 和 应用程序
- Mac下erlang调用crypto模块异常
- ASCII 码表及说明
- OOA/OOD/OOP
- LeetCode 058 Length of Last Word
- 一个统计网站访问IP的实例
- enum的使用和遐想
- 面向数据流的方法设计系统的软件结构(储蓄系统)
- 关于声明控件用weak和strong的问题&NSString用copy好还是strong