C++ 如何确定当页面在 web 浏览器控件中是否加载

若要在 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;
   }
}


你可能感兴趣的:(C++,Web,mfc)