「沒有做不到,只有想不到」 — 凡 IE 能呈現的內容 (HTML、圖片、Flash、Office 文檔、PDF、XML、SVG…),內嵌 WebBrowser 控件的應用程式皆可複用,無需自行解析渲染。
CWebBrowser2 包裝類。m_ie (型別 CWebBrowser2)。撰寫 HTML 字串內嵌 <bgsound>、<embed src="xxx.swf">、<img>,呼導 Navigate2("about:blank") 後用 IPersistStreamInit::Load 載入 (參考文章 8474 技巧一),或存為暫存 .htm 檔 Navigate2("file://...")。
m_ie.Navigate2(_T("C:\\Doc\\Report.doc")),控件自動就地啟動 Word/Excel/Reader 顯示。.xls, .ppt, .pdf, .txt, .rtf 等所有 IE 關聯類型。呼叫 ExecWB 執行 OLECMDID_PRINT / OLECMDID_PRINTPREVIEW / OLECMDID_PAGESETUP:
// 列印預覽
m_ie.ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
// 直接列印
m_ie.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
// 頁面設定
m_ie.ExecWB(OLECMDID_PAGESETUP, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
ExecWB 共支援 30+ 命令 (儲存、複製、全選、屬性…),詳見 MSDN OLECMDID 列舉。
重載 CHtmlView::OnBeforeNavigate2 (或沉連 DWebBrowserEvents2::BeforeNavigate2):
void CMyView::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags,
LPCTSTR lpszTargetFrameName, CByteArray& baPostedData,
LPCTSTR lpszHeaders, BOOL* pbCancel)
{
// 1. 導航重導向
if (_tcsstr(lpszURL, _T("blocked.com"))) { *pbCancel = TRUE; return; }
// 2. 提取 POST 資料 (baPostedData 為安全陣列)
if (baPostedData.GetSize() > 0)
{
CString strPost((char*)baPostedData.GetData(), baPostedData.GetSize());
// 解析 application/x-www-form-urlencoded ...
}
}
IDocHostUIHandler::GetExternal 暴露 C++ 物件給 window.external。window.external.SaveData(jsonStr) 回傳資料,C++ 解析 JSON 入庫。
res:// 協議),免散佈檔案。ShowHTMLDialogEx 實現 HTML 模態對話框 (參考文章 8474)。DocumentComplete 事件確認載入完成後再操作 DOM。內嵌 WebBrowser 控件 = 擁有 IE 完整渲染引擎 + ActiveX 文檔伺服器 + 腳本引擎 + DOM API。善用它能以極低成本實現富媒體、文檔檢視、排版列印、現代化 UI 等高階功能。
本文配套 VC6 MFC 範例專案可供下載。