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