【MFC】在CHtmlView中準確判斷頁面加載完成

之前的方法繁瑣,這裏抄了別人的方法,作了簡單修改。記錄下。函數

首先要在CHtmlView的子類中,重載以下函數:this

virtual void DocumentComplete(LPDISPATCH pDisp, VARIANT* URL);
virtual void NavigateComplete2(LPDISPATCH pDisp, VARIANT* URL);

這2個函數,不是下面的函數:spa

virtual void OnDocumentComplete(VARIANT* URL);
virtual void OnNavigateComplete2(VARIANT* URL);

在CHtmlView的子類中,添加一個成員,並在構造函數時初始化爲NULL:code

LPDISPATCH  m_lpURLDisp;

在NavigateComplete2中記錄訪問的LPDISPATCH。blog

void CXxxView::NavigateComplete2(LPDISPATCH pDisp, VARIANT* URL)
{
    if ( !m_lpURLDisp )
        m_lpURLDisp = pDisp;

    /* 能夠不調用父類的方法, 建議調用。不調用Navigate相關的其餘函數可能受到印象 */
    CHtmlView::NavigateComplete2(pDisp, URL);
}

在DocumentComplete中判斷這個DISPATCH。class

void CXxxView::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL)
{
    if ( m_lpURLDisp && m_lpURLDisp == pDisp )
    {
        CUtils::DbgView(TEXT("真在完成: %s\n"), (LPCTSTR)(_bstr_t)URL);
    }

    /* 不調用父類的方法, 會致使OnDocumentComplete不會觸發 */
    CHtmlView::DocumentComplete(pDisp, URL);
}

在訪問URL前,重置m_lpWBDisp成員爲NULL。構造函數

void CXxxView::_FreeDISP()
{
    if ( m_lpURLDisp )
        m_lpURLDisp->Release();
    m_lpURLDisp = NULL;
}

void CXxxView::Browser(LPCTSTR Url)
{
    this->_FreeDISP();

    DWORD dwFlags = navNoHistory;
    CHtmlView::Navigate2(Url, dwFlags, NULL);
}
相關文章
相關標籤/搜索