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

来源:互联网 发布:c语言接口与实现 豆瓣 编辑:程序博客网 时间:2024/05/17 06:01

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脚本更改页面结构时,也有可能会触发加载完成事件,但是上面所说的方法却不适用于此情况。在这种情况下,可以延后一定的时间再处理。

原创粉丝点击