首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

嵌入式瀏覽器定制與擴展全攻略:CHtmlView 進階實戰

     編輯:關於VC++

前言

專案常需嵌入瀏覽器並進行深度定制。MFC 提供 CHtmlView、CDHtmlDialog 封裝 WebBrowser 控制項,比直接用 ActiveX 容易得多。本文以衍生類 CLhpHtmlView 為基礎,系統講解定制/擴展關鍵技術。

核心架構:自訂控制站點

瀏覽器透過控制站點 (COleControlSite) 查詢擴充介面 (如 IDocHostUIHandler)。MFC 7.0 預設站點 CHtmlControlSite 僅實作 IDocHostUIHandler。需實作更多介面時,必須自訂控制站點類別 (本文為 CDocHostSite) 並覆寫 CHtmlView::CreateControlSite:

BOOL CLhpHtmlView::CreateControlSite(COleControlContainer* pContainer,
    COleControlSite** ppSite, UINT, REFCLSID)
{
    *ppSite = new CDocHostSite(pContainer, this);
    return (*ppSite) ? TRUE : FALSE;
}

VC6 替換站點較複雜,需另行處理。

功能一:定制滑鼠右鍵選單

實作 IDocHostUIHandler2::ShowContextMenu,轉呼叫 CLhpHtmlView::OnShowContextMenu。定義四種模式:

enum CONTEXT_MENU_MODE { NoContextMenu, DefaultMenu, TextSelectionOnly, CustomMenu };
  • NoContextMenu:完全禁用右鍵選單
  • DefaultMenu:IE 預設選單
  • TextSelectionOnly:僅文字選取時顯示選單
  • CustomMenu:完全自訂,覆寫 OnShowCustomContextMenu 彈出 MFC 選單,可根據點擊元素 ID 動態生成項目

範例程式碼展示根據元素 ID 顯示不同選單項目並處理命令。

功能二:腳本擴展 — 關鍵 external 介面

實作 IDocHostUIHandler::GetExternal 轉呼叫 OnGetExternal,回傳 IDispatch 指標。網頁腳本即可用 window.external.Method() 呼叫 C++ 方法。

  • CLhpHtmlView 繼承 CCmdTarget,建構函數呼叫 EnableAutomation()。
  • 用 DECLARE_DISPATCH_MAP / BEGIN_DISPATCH_MAP 公開方法。
  • DISP_FUNCTION 宏對應參數型別 (注意 VTS_BSTR 對應 LPCSTR 而非 CString)。
// 範例:點擊網頁按鈕觸發視窗抖動
BEGIN_DISPATCH_MAP(CDemoView, CLhpHtmlView)
    DISP_FUNCTION(CDemoView, "WobbleWnd", WobbleWnd, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()

void CDemoView::WobbleWnd() { /* 實作視窗抖動 */ }

網頁:<button onclick="external.WobbleWnd()">

功能三:C++ 呼叫網頁 JavaScript

透過 IHTMLDocument2::scripts 取得腳本集合,用 IDispatch::GetIDsOfNames 取得 DISPID,再 Invoke 執行。CLhpHtmlView 封裝便利函數,搜尋關鍵字 "JScript" 參考。

功能四:定制訊息方塊標題

實作 IDocHostShowUI::ShowMessage 轉呼叫 OnShowMessage。載入 SHDOCLC.DLL 資源比對預設標題 "Microsoft Internet Explorer",相符時替換為自訂標題 (m_DefaultMsgBoxTitle),自行彈出 MessageBox 並回傳結果。

功能五:修改 HTTP 請求標頭 / User-Agent

  • 自訂標頭:Navigate2 參數 lpszHeaders 可加入自訂欄位。
  • 修改 User-Agent:在 OnBeforeNavigate2 檢測標頭無自訂 UA 時,取消導航、附加 UA、PostMessage 重新導航 (必須 Post 讓 OnBeforeNavigate2 返回後再導航,避免無限循環)。

功能六:消除 WM_SIZE 例外警告

CHtmlView::OnSize 會產生 COleException (DISP_E_MEMBERNOTFOUND)。修正:呼叫 CFormView::OnSize 並用 AdjustWindowRectEx 計算矩形後 SetWindowPos。

功能七:處理瀏覽器內拖放

實作 IDocHostUIHandler::GetDropTarget 回傳自訂 COleDropTarget 衍生類 (CMyOleDropTarget)。視圖類別重寫 OnDragEnter/OnDragOver/OnDrop/OnDragLeave。網頁元素需處理 ondragenter/ondragover/ondrop 並回傳 false 讓 C++ 程式碼接管。

功能八:禁止網頁元素被選取

兩種方式:

  1. 宿主資訊旗標加入 DOCHOSTUIFLAG_DIALOG:在 OnGetHostInfo 設定 dwFlags。
  2. 網頁腳本:document.onselectstart = function(){return false;} 或 <body onselectstart="return false">。

其他實用封裝函數

  • PutElementHtml / GetElementValue / PutElementValue:修改/讀取元素 HTML/值
  • ElementSetFocus:設定表單焦點

結語

掌握自訂控制站點、IDocHostUIHandler 系列介面、DISPATCH_MAP、外部介面、導航事件攔截、拖放處理,即可將嵌入式瀏覽器打造為功能完整的應用程式平台。完整原始碼請參考附件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved