标签:
若要在 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 浏览器控件。
在 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; } }
C++_MFC 如何确定当页面是在 web 浏览器控件的加载
标签:
原文地址:http://my.oschina.net/shou1156226/blog/523660