天天看點

在對話框中使用CHtmlView類打開網頁

為了在對話框中顯示HTML檔案,必須将CHtmlCtrl類與對話框中的一個靜态控制(也可以是其它控制)關聯起來,這樣才能為顯示HTML檔案提供一個視窗,為此可以在CHtmlCtrl類中定義一個建立函數:

BOOL CHTMLCtrl::CreateFromStatic(CStatic* pStaticWnd, CWnd* pParent) 

    ASSERT(NULL!=pStaticWnd && NULL!=pStaticWnd->GetSafeHwnd()); 

    ASSERT(NULL!=pParent && NULL!=pParent->GetSafeHwnd()); 

    CRect rc; 

    pStaticWnd->GetClientRect(&rc); 

    int nID = pStaticWnd->GetDlgCtrlID(); 

    LPCTSTR lpClassName = AfxRegisterWndClass(NULL); 

    return Create(lpClassName, _T(""), WS_CHILD|WS_VISIBLE, rc, pParent, nID, NULL); 

注意觀察nID是必須的.

重載這個函數(必須),這是避免主要程式将CHtmlView對象看作是文檔/視圖架構:

int CHTMLCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message) 

    // TODO: Add your message handler code here and/or call default 

    return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message); 

//Do not call it. 

    // return CHtmlView::OnMouseActivate(pDesktopWnd, nHitTest, message); 

然後在對話框中可以這樣調用:

BOOL CHomePage::OnInitDialog() 

    CDialog::OnInitDialog(); 

    GetClientRect(&rc); 

    CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC_HTML); 

    pStatic->MoveWindow(&rc); 

    m_pHTMLPage = new CHTMLCtrl; 

    CHTMLCtrl* pHTMLCtrl = (CHTMLCtrl*)m_pHTMLPage; 

    pHTMLCtrl->CreateFromStatic(pStatic, this); 

    pHTMLCtrl->Navigate(_T("http://www.osssk1.com")); 

    return TRUE; 

另外,函數Navigate不但支援URL,還可以打開一個本地html檔案,隻是要指定具體的路徑.

函數CHTMLCtrl::OnNavigateError(...DWORD dwError...)有一個指出打開URL是否正确的參數dwError,如果它的值不是200,證明是錯誤的,此時不需要再向下執行,而是轉而打開本地html檔案.需要注意的是,打開本地檔案應該從父視窗打開,而不是該類對象自己的行為.是以這裡向父視窗發送一個消息(異步發送).

void CHTMLCtrl::OnNavigateError(LPCTSTR lpszURL, LPCTSTR lpszFrame, 

DWORD dwError,BOOL *pbCancel) 

    if (200!=dwError && 0==_tcscmp(_T("http://www.osssk1.com/"), lpszURL)) 

    { 

        // Navigate to local html file. 

        GetParent()->PostMessage(WM_NAVI_LOCAL_URL, 0, 0); 

        return; 

    } 

    return CHtmlView::OnNavigateError(lpszURL, lpszFrame, dwError, pbCancel); 

父視窗接收到該消息就知道打開URL失敗,應該打開本地html檔案.

BOOL CHomePage::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult) 

    // TODO: Add your specialized code here and/or call the base class 

    if (WM_NAVI_LOCAL_URL == message) 

        CHTMLCtrl* pHTMLCtrl = (CHTMLCtrl*)m_pHTMLPage; 

        pHTMLCtrl->Navigate(_T("e:\\index.html")); 

        return TRUE; 

    return CDialog::OnWndMsg(message, wParam, lParam, pResult); 

本文轉自jetyi51CTO部落格,原文連結:http://blog.51cto.com/jetyi/1073361 ,如需轉載請自行聯系原作者

繼續閱讀