Como determinar quando uma página é concluída o carregamento no controlo WebBrowser

Traduções de Artigos Traduções de Artigos
Artigo: 180366 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sumário

O controlo WebBrowser do Internet Explorer é accionado o evento DocumentComplete quando tiver terminado transferir uma página Web. Pode criar uma função de rotina de tratamento de eventos da aplicação para este evento. Este artigo descreve passos para determinar se um controlo WebBrowser estiver concluído transferir uma página Web.

Mais Informação

O controlo WebBrowser é accionado o evento DocumentComplete quando a propriedade ReadyState é alterada para READYSTATE_COMPLETE. Isto indica que o controlo WebBrowser concluiu a transferência da página Web. Eis alguns pontos importantes sobre este evento:
  • No caso de uma página com sem frames, DocumentComplete é desencadeado uma vez depois de tudo é efectuado.
  • No caso de vários pacotes, DocumentComplete obtém desencadeado várias vezes. Este evento é accionado nem todos os pacotes, mas cada pacote que é accionado um evento DownloadBegin é accionado um evento DocumentComplete correspondente.
  • O evento DocumentComplete tem um IDispatch * parâmetro, que é IDispatch da moldura (shdocvw) para o qual DocumentComplete for accionado.
  • A moldura de nível superior é accionado DocumentComplete no final. Assim, para verificar se é efectuada uma página de transferência, é necessário verificar se o parâmetro IDispatch * é igual a IDispatch do controlo WebBrowser.

    Para o Visual Basic, é aqui código que executa esta verificação:
    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
    					
Para processar o evento DocumentComplete no Visual C++ e determinar se a transferência da página Web estiver concluída, siga estes passos.

Tenha em atenção que os passos a segue dependem da forma que utiliza o controlo WebBrowser.
  • Se estiver a criar o controlo WebBrowser num objecto CWnd/CView, terá de seguir os passos 1 a 4.
  • Se estiver a criar o controlo WebBrowser num objecto CDialog/CFormView, apenas necessita de seguir o passo 4.
  • Se estiver a utilizar a classe CHtmlView fornecida com o Visual C++ 6.0, substituir CHtmlView::DocumentComplete() e siga o passo 4, utilizar o membro m_pBrowserApp da classe CHtmlView para aceder o controlo WebBrowser.
  1. Definir o método OnDocumentComplete no ficheiro de cabeçalho para a classe/CView CWnd derivada:
    afx_msg void OnDocumentComplete(LPDISPATCH lpDisp,
                                    VARIANT FAR* URL);
    					
  2. Declarar o receptor de eventos no mesmo ficheiro de cabeçalho:
    DECLARE_EVENTSINK_MAP()
    					
  3. No implementação ficheiro (.cpp) para a classe/CView CWnd derivada, implementar o mapa de receptor de eventos:
    BEGIN_EVENTSINK_MAP(CYourView, CView)
       ON_EVENT(CWBTstView, ID_WEB_BROWSE, 259 /* DocumentComplete */,
                OnDocumentComplete, VTS_DISPATCH VTS_PVARIANT)
    END_EVENTSINK_MAP()
    					
  4. Implementar o método 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();
    }
    					
Esta abordagem funciona quando o controlo WebBrowser navega para uma página que altera a moldura de nível superior. Indicar se a navegação ocorre dentro de uma moldura, o DocumentComplete final que é desencadeado é que a moldura e não na moldura de nível superior. Por exemplo, considere o seguinte cenário.

O controlo WebBrowser hospeda um conjunto de molduras. Dentro de uma moldura do conjunto de frames, o utilizador clica numa hiperligação que abre uma nova página na frame próprio e mantém intacto o resto do conjunto de frames. A nova página pode conter várias frames novamente. Assim, vão existir várias notificações DocumentComplete (uma para cada nova moldura). No entanto, uma vez que a moldura de nível superior não foi alterada, DocumentComplete final seria que do pacote que foi alterado.

Se estiver interessado na verificação de documento final concluído neste cenário, poderia efectue o seguinte:
Verifique se o parâmetro IDispatch o DocumentComplete é o mesmo que o parâmetro de IDispatch do primeiro evento NavigateComplete2. Uma vez que a primeira NavigateComplete2 é da moldura de nível superior e DocumentComplete última é também da moldura de nível superior, fazer uma comparação de tal forma indicará se a página é feita transferência.
Eis alguns exemplos de código 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;
   }
}
				

Propriedades

Artigo: 180366 - Última revisão: 1 de julho de 2004 - Revisão: 2.1
A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbmt kbhowto KB180366 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 180366
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

Submeter comentários

 

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