WebBrowser 控制項中載入 how to determine 是當完成頁面

文章翻譯 文章翻譯
文章編號: 180366 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

結論

Internet Explorer WebBrowser 控制項引發事件 DocumentComplete 當它完成時, 下載 Web 網頁 您可以在您的應用程式針對這個事件建立事件處理常式函式。 本篇文章說明如何在判斷是否使用 WebBrowser 控制項已完成下載 Web 網頁

其他相關資訊

WebBrowser 控制項會 DocumentComplete 事件要 READYSTATE_COMPLETE ReadyState 屬性變更時。 這表示 WebBrowser 控制項已完成下載 Web 網頁。 以下是一些有關此事件的重點:
  • 在一切都完成後的頁面沒有框架, DocumentComplete 會引發一次。
  • 如果是多個框架, DocumentComplete 取得引發多次。 並非每個框架會引發這個事件, 但每個框架, 會引發 DownloadBegin 事件會引發相對應的 DocumentComplete 事件。
  • DocumentComplete 事件有一個 IDispatch * 參數, (也就是 IDispatch 的框架 (shdocvw) DocumentComplete 要為其引發。
  • 最上層框架會引發 DocumentComplete 在尾端。 如此, 來檢查如果頁面會完成下載, 您要檢查 IDispatch * 參數是否與 IDispatch 的 WebBrowser 控制項相同

    在 Visual Basic, 以下是執行這項檢查程式碼:
    Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object,
                                             URL As Variant)
       If (pDisp Is WebBrowser1.Object) Then
          Debug.Print "Web document is finished downloading"
       End If
    End Sub
    					
以處理 DocumentComplete 事件在 Visual C++ 並決定是否下載的 Web 網頁, 完整請依照下列步驟執行。

請注意, 您遵循步驟取決於方式與使用 WebBrowser 控制項。
  • 如果您在 CWnd / CView 物件, 建立 WebBrowser 控制項必須遵循步驟 1 到 4。
  • 如果要建立在 / CFormView CDialog 物件, WebBrowser 控制項只需要依循步驟 4。
  • 如果您是使用隨附 Visual C++ 6.0, CHtmlView 類別覆寫 CHtmlView::DocumentComplete() 並依循步驟 4, 使用 m_pBrowserApp CHtmlView 類別的成員來存取 WebBrowser 控制項。
  1. 在標頭檔為您的 CWnd / CView 衍生類別中定義 OnDocumentComplete 方法:
    afx_msg void OnDocumentComplete(LPDISPATCH lpDisp,
                                    VARIANT FAR* URL);
    					
  2. 宣告事件接收器在相同的標頭檔:
    DECLARE_EVENTSINK_MAP()
    					
  3. 在實作檔 (. cpp) 為您的 CWnd / CView 衍生類別, 實作事件接收對應:
    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();
    }
    					
WebBrowser 控制項巡覽至網頁, 變更最上層框架時才可使用這種方法。 假設如果巡覽位於圖文框本身, 則最後 DocumentComplete 引發, 會是圖文框與非最上層框架。 例如,假設下列案例:.

WebBrowser 控制項是裝載框架組。 在一個框架的框架組, 使用者按一下框架本身中開啟新頁面並原封不動保留其餘的框架組連結。 新頁面可能包含多個框架一次。 所以, 將會多個 DocumentComplete 通知 (一個為每個新框架。 但, 最終 DocumentComplete 由於最上層框架已無法變更, 會已變更的框架。

如果您有興趣檢查完成在這種情況下, 最終文件中您可以執行下列動作:
請檢查是否與相同的第一個 NavigateComplete2 事件 IDispatch 參數的 DocumentComplete 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;
   }
}
				

屬性

文章編號: 180366 - 上次校閱: 2004年7月1日 - 版次: 2.1
這篇文章中的資訊適用於:
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 5.5
關鍵字:?
kbhowto KB180366 KbMtzh kbmt
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。如果您發現錯誤,並想要協助我們進行改善,請填寫本篇文章下方的問卷。
按一下這裡查看此文章的英文版本:180366
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com