若要在 Visual C++ DocumentComplete 处理并确定完成该 Web 页的下载后,请按照下列步骤。
请注意,您所执行的步骤取决于您使用 web 浏览器控件的方式。
如果要在 CWnd/CView 对象创建 web 浏览器控件,则必须按照步骤 1 到 4。
如果您正在 CDialog/CFormView 对象中创建 web 浏览器控件,只需执行第 4 步。
如果您使用的 Visual C++ 6.0 所附带的 CHtmlView 类,重写 CHtmlView::DocumentComplete(),并执行第 4 步,使用 CHtmlView 类的 m_pBrowserApp 成员来访问 web 浏览器控件。
1. 在 CWnd/CView 派生类的头文件中定义的 OnDocumentComplete 方法:
afx_msg void OnDocumentComplete(LPDISPATCH lpDisp,VARIANT FAR* URL);
2. 声明相同的头文件中的事件接收器:
DECLARE_EVENTSINK_MAP()
3. 在 CWnd/CView 派生类的实现文件 (.cpp),来实现事件接收映射:
BEGIN_EVENTSINK_MAP(CYourView, CView)
ON_EVENT(CWBTstView, ID_WEB_BROWSE, 259 /* DocumentComplete */,OnDocumentComplete, VTS_DISPATCH VTS_PVARIANT)
END_EVENTSINK_MAP()
4. 实现 OnDocumentComplete 方法:
void CWBTstView::OnDocumentComplete(LPDISPATCH lpDisp,VARIANT FAR* URL) {
IUnknown* pUnk;
LPDISPATCH lpWBDisp;
HRESULT hr;
pUnk = m_webBrowser.GetControlUnknown();
ASSERT(pUnk);
hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);
ASSERT(SUCCEEDED(hr));
if (lpDisp == lpWBDisp ){
// Top-level Window object, so document has been loaded
TRACE("Web document is finished downloading\n");
}
lpWBDisp->Release();
}
在 web 浏览器控件导航到更改顶级框架页时,此方法有效。说是否导航出现在框架本身,则激发最后 DocumentComplete 的框架并不是顶级的框架。例如,请考虑下面的方案。
Web 浏览器控件承载框架集。在框架集的某个框架,用户单击的链接本身的框架中打开一个新页面,并将该框架集的其余部分保持不变。再次,新页面可能包含多个帧。因此,将有多个 DocumentComplete 通知 (一个用于每个新帧)。但最终 DocumentComplete 因为顶级框架尚未更改,都会到框架的程序已更改。
如果您有兴趣检查最终文档完成此方案中,无法执行以下操作:检查 DocumentComplete 的 IDispatch 参数是否与第一个 NavigateComplete2 事件的 IDispatch 参数相同。由于第一个 NavigateComplete2 的顶级框架,并且最后 DocumentComplete 的顶级框架也是,进行比较的方式将告诉页是否就完成下载。
下面是一些示例 c + + 代码:
LPDISPATCH glpDisp = NULL; // global LPDISPATCH, can also
// be of class scope
// NavigateComplete2 event
void CWebbrDlg::OnNavigateComplete2Explorer1(LPDISPATCH pDisp,
VARIANT FAR* URL)
{
// Check if glpDisp is NULL. If NULL, that means it is
// the top level NavigateComplete2. Save the LPDISPATCH
if (!glpDisp)
glpDisp = pDisp;
}
void CWebbrDlg::OnDocumentCompleteExplorer1(LPDISPATCH pDisp,
VARIANT FAR* URL)
{
if (glpDisp && glpDisp == pDisp)
{
// if the LPDISPATCH are same, that means
// it is the final DocumentComplete. Reset glpDisp
TRACE("Document is done downloading");
glpDisp = NULL;
}
}