博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Activex感知网页刷新关闭事件
阅读量:6830 次
发布时间:2019-06-26

本文共 2172 字,大约阅读时间需要 7 分钟。

原因

大多数ActiveX控件框架,例如MFC和ATL,在本地激活ActiveX控件时创建控件。基于性能上的考虑,直到控件第一次可见的时候,IE才本地激活ActiveX控件。这样包含ActiveX控件的网页载入更加迅速,占用内存更少。这也使得ActiveX控件的WM_CREATE处理代码直到控件第一次可见的时候才被调用。

如果控件支持非窗口激活,那么IE会以非窗口激活方式创建控件,这样在离开或者关闭页面的时候控件的WM_DESTORY处理代码不会被调用。

解决方案

IE在初始化或者退出页面的时候会调用页面中的ActiveX控件的IOleObject::SetClientSite的实现,无论控件是否被本地激活。在初始化页面的时候,传递的指针是宿主的IOleClientSite 接口指针,在离开或者关闭页面的时候,传递的指针是空指针。可以根据这个指针来判断控件的状态,并且执行初始化或者清除的代码。

MFCMFC对IOleObject::SetClientSite()的实现包含对虚函数COleControl::OnSetClientSite()的调用。这时候可以根据m_pClientSite是否为空指针来判断控件是被加载还是被清除。// CMyControl 派生于COleControl.void CMyControl::OnSetClientSite(){    if (m_pClientSite) //父窗口及其大小并不重要,因为控件在本地激活时会自动重画和重新定位。       VERIFY (CreateControlWindow (::GetDesktopWindow(), CRect(0,0,0,0), CRect(0,0,0,0)));    else        DestroyWindow();     COleControl::OnSetClientSite();}ATLATL对IOleObject::SetClientSite()的实现有一个IOleClientSite类型的参数(MFC在对IOleObject::SetClientSite()的实现中保存这个指针到COleControl::m_pClientSite),直接拿来判断就行了。同时,ATL没有重新设置控件的父窗口,所以控件需要手动进行本地激活。// CMyControl 派生于CComControl STDMETHOD(SetClientSite)(IOleClientSite *pClientSite){    if (pClientSite)    {        RECT rc = {
0,0,0,0}; // Don't have access to the Container's window so just use the // desktop. Window will be resized correctly during in-place // activation. HWND hWnd = CreateControlWindow(::GetDesktopWindow(), rc); _ASSERT (hWnd); } else ::DestroyWindow(m_hWnd); return IOleObjectImpl::SetClientSite (pClientSite);}HRESULT InPlaceActivate(LONG iVerb, const RECT* prcPosRect) { // Get the container's window. _ASSERT (m_spClientSite); LPOLEINPLACESITE pInPlaceSite = NULL; HRESULT hr = m_spClientSite->QueryInterface(IID_IOleInPlaceSite, (void **)&pInPlaceSite); _ASSERT (SUCCEEDED (hr) && pInPlaceSite); HWND hParent = NULL; hr = pInPlaceSite->GetWindow (&hParent); _ASSERT (SUCCEEDED (hr) && hParent); pInPlaceSite->Release (); // Set container window as our parent window SetParent (hParent); < BR > return CComControlBase::InPlaceActivate(iVerb, prcPosRect); < BR > }

---------------------------------

http://blog.csdn.net/flyingroc0209/article/details/51036113

你可能感兴趣的文章
什么是TensorBoard?
查看>>
HBase+Spark技术双周刊 第三期
查看>>
SIGIR阿里论文 | 一种端到端的模型:基于异构内容流的动态排序 ...
查看>>
一对一视频聊天app开发借助了哪些CDN的服务功能? ...
查看>>
Cloud Toolkit 1.1.0 支持 Command 清理
查看>>
【火热报名】1月19日阿里云栖开发者沙龙合肥专场:高并发企业级应用架构实践分享 ...
查看>>
特斯拉也裁员,马斯克长文诉苦:特斯拉太难了,真的没有办法!
查看>>
一对一直播的市场行情分析,潜力非常可观
查看>>
小白如何购买阿里云服务器(2019最详细教程)
查看>>
ORACLE中Like与Instr模糊查询性能大比拼
查看>>
redis config
查看>>
Linux基础命令---文本过滤colrm
查看>>
快速搭建react项目骨架(按需加载、redux、axios、项目级目录等等)
查看>>
GPU编程(五): 利用好shared memory
查看>>
安装k8s 1.9.0 实践:问题集锦
查看>>
k8s RBAC 多租户权限控制实现
查看>>
30 岁转行做Python开发晚吗?而且是零基础
查看>>
GGV、祥峰投资、SIG领投,社区电商平台小区乐完成1.08亿美元A轮融资
查看>>
蓝牙BLE(BlueTooth BLE)入门及爬坑指南
查看>>
springboot结合maven打包发布
查看>>