判断多Frame网页是否真正加载完毕(CHtmlView)

1. 手工重载添加两个虚拟函数:

virtualvoidDocumentComplete(LPDISPATCHpDisp,VARIANT*URL);

virtualvoidNavigateComplete2(LPDISPATCHpDisp,VARIANT*URL);

注意:不是以下两个函数

virtualvoid OnDocumentComplete(VARIANT* URL);

virtualvoid OnNavigateComplete2(VARIANT* URL);

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

2. 声明一个成员变量,并在构造函数中进行初始化:

LPDISPATCHm_lpDisp;//用于判断网页加载是否真正完毕

m_lpDisp =NULL;//构造函数中初始化

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

3. 这两个函数的具体实现:(参照微软)

//配合NavigateComplete2,判断网页是否真正加载完毕,用于多Frame网页

voidCXXXXView::DocumentComplete(LPDISPATCHpDisp,VARIANT*URL)

{

if(m_lpDisp &&(m_lpDisp == pDisp))//判断网页是否真正加载完毕,用于多Frame网页

{

//if the LPDISPATCH are same,that means it is the final DocumentComplete

TRACE("Document is done downloading");

AfxMessageBox("下载完毕");

m_lpDisp=NULL;//Reset glpDisp

}

}

//配合DocumentComplete,判断网页是否真正加载完毕,用于多Frame网页

voidCXXXXView::NavigateComplete2(LPDISPATCHpDisp,VARIANT*URL)

{

//Check if glpDisp is NULL.If NULL,that means it is

//the top level NavigateComplete2. Save the LPDISPATCH

if(!m_lpDisp)m_lpDisp=pDisp;

}

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

4. 测试环境:

编程工具: VC6

操作系统: XP SP2

在你的CHtmlView继承类头文件中添加:

public:
void DocumentComplete(LPDISPATCH pDisp, VARIANT* URL);

然后在实现文件中添加:

void CMyHtmlView::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL)

{

    // 这里写什么呢?

}

上面函数的实现部分写什么呢?就是前面所说的“判断页面是否加载完成”的代码了。我们从MS的这篇惨不忍睹的机器翻译的文章里(真恨我没找到英文的),还是可以得到一些启发的,我修改了一下,使得代码适合于VC 2005+IE7的环境,如下:

void CMyHtmlView::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL)
{
     m_nCount++;    // 这是我的一个类成员变量,用于计数

     LPDISPATCH lpWBDisp = NULL;
     HRESULT    hr = NULL;


     hr = m_pBrowserApp->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);
     ASSERT(SUCCEEDED(hr));

     if (pDisp == lpWBDisp)
     {
      CString strMessage;
      strMessage.Format("页面加载完成!/n/n进入DocumentComplete函数的次数:%d", m_nCount);
      // Top-level Window object, so document has been loaded
      MessageBox(strMessage);
     }

     lpWBDisp->Release();
}

更新根据网上的一篇文章得知:页面上的JavaScript脚本更改页面结构时,也有可能会触发加载完成事件,但是上面所说的方法却不适用于此情况。在这种情况下,可以延后一定的时间再处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值