1. 程式人生 > >VC在對話方塊中顯示網頁並對網頁進行操作

VC在對話方塊中顯示網頁並對網頁進行操作

VC對話方塊程式中顯示網頁有兩種方法:

(1) 利用Active控制元件。

1. 新增"Microsoft web瀏覽器"控制元件:Add to Project

       ->Components and controls->Registered ActiveX  

      Controls->Microsoft Web 瀏覽器

2. 新增控制元件到對話方塊;

3. 為控制元件新增變數:CWebBrowser2 m_web;

4. 新增返回變數 VARIANT vart;

5.  呼叫m_web.Navigate("URL",&vart,&vart,&vart,&vart);即可

    在對話方塊中的webBrowser控制元件顯示網頁;

(2)使用CHtmlView類開啟網頁

為了在對話方塊中顯示HTML檔案,必須將CHtmlCtrl類與對話方塊中的一個靜態控制(也可以是其它控制)關聯起來,這樣才能為顯示HTML檔案提供一個視窗,為此可以在CHtmlCtrl類中定義一個建立函式:
  1. BOOL CHTMLCtrl::CreateFromStatic(CStatic* pStaticWnd, CWnd* pParent) 
  2.     ASSERT(NULL!=pStaticWnd && NULL!=pStaticWnd->GetSafeHwnd()); 
  3.     ASSERT(NULL!=pParent && NULL!=pParent->GetSafeHwnd()); 
  4.     CRect rc; 
  5.     pStaticWnd->GetClientRect(&rc); 
  6.     int nID = pStaticWnd->GetDlgCtrlID(); 
  7.     LPCTSTR lpClassName = AfxRegisterWndClass(NULL); 
  8.     return Create(lpClassName, _T(""), WS_CHILD|WS_VISIBLE, rc, pParent, nID, NULL); 
注意觀察nID是必須的. 過載這個函式(必須),這是避免主控程式將CHtmlView物件看作是文件/檢視框架:
  1. int CHTMLCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message) 
  2.     // TODO: Add your message handler code here and/or call default
  3.     return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message); 
  4. //Do not call it.
  5.     // return CHtmlView::OnMouseActivate(pDesktopWnd, nHitTest, message); 
然後在對話方塊中可以這樣呼叫:
  1. BOOL CHomePage::OnInitDialog() 
  2.     CDialog::OnInitDialog(); 
  3.     CRect rc; 
  4.     GetClientRect(&rc); 
  5.     CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC_HTML); 
  6.     pStatic->MoveWindow(&rc); 
  7.     m_pHTMLPage = new CHTMLCtrl; 
  8.     CHTMLCtrl* pHTMLCtrl = (CHTMLCtrl*)m_pHTMLPage; 
  9.     pHTMLCtrl->CreateFromStatic(pStatic, this); 
  10.     pHTMLCtrl->Navigate(_T("http://www.osssk1.com")); 
  11.     return TRUE; 
另外,函式Navigate不但支援URL,還可以開啟一個本地html檔案,只是要指定具體的路徑. 函式CHTMLCtrl::OnNavigateError(...DWORD dwError...)有一個指出開啟URL是否正確的引數dwError,如果它的值不是200,證明是錯誤的,此時不需要再向下執行,而是轉而開啟本地html檔案.需要注意的是,開啟本地檔案應該從父視窗開啟,而不是該類物件自己的行為.所以這裡向父視窗傳送一個訊息(非同步傳送).
  1. void CHTMLCtrl::OnNavigateError(LPCTSTR lpszURL, LPCTSTR lpszFrame, 
  2. DWORD dwError,BOOL *pbCancel) 
  3.     if (200!=dwError && 0==_tcscmp(_T("http://www.osssk1.com/"), lpszURL)) 
  4.     { 
  5.         // Navigate to local html file.
  6.         GetParent()->PostMessage(WM_NAVI_LOCAL_URL, 0, 0); 
  7.         return
  8.     } 
  9.     return CHtmlView::OnNavigateError(lpszURL, lpszFrame, dwError, pbCancel); 
父視窗接收到該訊息就知道開啟URL失敗,應該開啟本地html檔案.
  1. BOOL CHomePage::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
  2.     // TODO: Add your specialized code here and/or call the base class
  3.     if (WM_NAVI_LOCAL_URL == message) 
  4.     { 
  5.         CHTMLCtrl* pHTMLCtrl = (CHTMLCtrl*)m_pHTMLPage; 
  6.         pHTMLCtrl->Navigate(_T("e:\\index.html")); 
  7.         return TRUE; 
  8.     } 
  9.     return CDialog::OnWndMsg(message, wParam, lParam, pResult);