Как определить, когда страницы выполняется загрузка элемента управления WebBrowser

Переводы статьи Переводы статьи
Код статьи: 180366
Развернуть все | Свернуть все

Аннотация

Элемент управления Internet Explorer WebBrowser вызывает событие DocumentComplete После завершения загрузки веб-страницы. Можно создать обработчик события функция приложения для этого события. В статье действия, необходимые для определения, если элемент управления WebBrowser завершена Загрузка веб-страницы.

Дополнительная информация

Элемент управления WebBrowser запускает событие DocumentComplete при его ReadyState Свойство изменяется на READYSTATE_COMPLETE. Это означает, что Элемент управления WebBrowser завершил загрузку веб-страницы. Вот несколько важные моменты, касающиеся этого события:
  • Из страницы с фреймами не 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++ и определить, если завершена загрузка веб-страницы, выполните следующие действия.

Обратите внимание на то, что шаги зависит способ использования элемента управления WebBrowser.
  • При создании элемента управления WebBrowser в объекте CWnd/CView вы выполните действия 1-4.
  • При создании элемента управления WebBrowser в объект класса CDialog/CFormView необходимо только выполнить шаг 4.
  • При использовании класса CHtmlView, поставляемые с Visual C++ 6.0 переопределить CHtmlView::DocumentComplete() и выполните шаг 4, используя m_pBrowserApp члена класса CHtmlView доступа элемента управления WebBrowser.
  1. Определите метод OnDocumentComplete в файл заголовка для класса CWnd, CView производные:
    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 бы рамки, наличие изменен.

Если вы заинтересованы в проверке итоговый документ завершен на этом сценарий, можно сделать следующее:
Проверять, является ли параметр IDispatch DocumentComplete так же, как параметр IDispatch первое событие NavigateComplete2. Поскольку Первый 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 - Последний отзыв: 4 июня 2011 г. - Revision: 4.0
Ключевые слова: 
kbhowto kbmt KB180366 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:180366
Заявление об отказе относительно содержимого статьи о продуктах, поддержка которых прекращена
Эта статья содержит сведения о продуктах, поддержка которых корпорацией Майкрософт прекращена. Поэтому она предлагается как есть и обновляться не будет.

Отправить отзыв

 

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