CHtmlView中,判断一个页面加载完成的准确方法
2013-03-13 15:30
253 查看
转自:http://hi.baidu.com/jakisou/item/e016473db5c99d637c034b90
晨了,但是关于这个问题一定要记录下来,要不然以后不记得了,还得走弯路。
在做一个测试的时候,为了便于自动操作,用VC写了个软件来代替人工操作。简单地说,功能就是:不断地刷某URL,服务器那一端的程序会返回另一个URL,要看服务器端程序会不会出问题,同时要记录一些信息。
两年多以来一直用VC开发,但是从未开发过浏览器相关的程序,这次我只能仓促上阵:用CHtmlView来实现一个超简浏览器,然后判断页面是否加载完成,在页面加载完成后再做后续处理。
文章来源:http://www.codelast.com/
查MSDN,便知道了OnDocumentComplete函数会由框架在加载完页面后触发,于是重载该函数,可是navigate到很多页面(例如www.sina.com.cn)时,均会发生该函数被触发N次的现象,于是查啊查,发现原因在于这些页面中含有多个frame,每一个frame加载完成后,均会通知,在顶级frame加载完成后,会做最后一次通知,于是要判断整个页面加载完,就只能用其他的方法了。
后来查到,未公开的函数DocumentComplete是一个关键,需要重载该函数。感谢VAssist的强大,我不需要查手册就直接把这个函数的原型敲出来了,具体说来,如果你要手工添加的话,请在你的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();
}
晨了,但是关于这个问题一定要记录下来,要不然以后不记得了,还得走弯路。
在做一个测试的时候,为了便于自动操作,用VC写了个软件来代替人工操作。简单地说,功能就是:不断地刷某URL,服务器那一端的程序会返回另一个URL,要看服务器端程序会不会出问题,同时要记录一些信息。
两年多以来一直用VC开发,但是从未开发过浏览器相关的程序,这次我只能仓促上阵:用CHtmlView来实现一个超简浏览器,然后判断页面是否加载完成,在页面加载完成后再做后续处理。
文章来源:http://www.codelast.com/
查MSDN,便知道了OnDocumentComplete函数会由框架在加载完页面后触发,于是重载该函数,可是navigate到很多页面(例如www.sina.com.cn)时,均会发生该函数被触发N次的现象,于是查啊查,发现原因在于这些页面中含有多个frame,每一个frame加载完成后,均会通知,在顶级frame加载完成后,会做最后一次通知,于是要判断整个页面加载完,就只能用其他的方法了。
后来查到,未公开的函数DocumentComplete是一个关键,需要重载该函数。感谢VAssist的强大,我不需要查手册就直接把这个函数的原型敲出来了,具体说来,如果你要手工添加的话,请在你的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();
}
相关文章推荐
- 在CHtmlView中,判断一个页面加载完成的准确方法
- 在CHtmlView中,判断一个页面加载完成的准确方法
- 在CHtmlView中,判断一个页面加载完成的准确方法,解决OnDocumentComplete多次调用问题
- 判断一个页面加载完全完成的准确方法
- 多种方法实现当jsp页面完全加载完成后执行一个js函数
- 页面加载完成后自动执行一个方法函数的JQ和JS方法
- 用js实现在加载完成一个页面后自动执行一个方法
- 01.判断页面加载完成的方法
- CHtmlView中判断页面加载完成
- 页面加载完成后自动执行一个方法函数的JQ、JS方法
- 01.判断页面加载完成的方法
- 用js实现在加载完成一个页面后自动执行一个方法
- iframe加载的页面判断都否加载完成的方法
- 多种方法实现当jsp页面完全加载完成后执行一个js函数
- 如何在页面加载完成后再去做某事?什么方法可以判断当前页面加载已完成?
- 加载完成一个页面后自动执行一个方法
- 解决webview多次加载,无法准确判断页面加载完成的问题
- 页面加载完成后自动执行一个方法函数的JQ、JS方法
- WebBrowser中如何准确判断整个页面完全加载完成
- 在CHtmlView中判断页面加载完成