CHtmlView 內部封裝 WebBrowser ActiveX 控制項,列印預覽需呼叫其 ExecWB 方法,而非覆寫 CView::OnPreparePrinting 等傳統 MFC 列印虛函數。
IWebBrowser2 指標:GetHtmlDocument() 或 m_pBrowserApp。ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DONTPROMPTUSER, ...)。OLECMDID_PRINT 直接列印。void CMyHtmlView::OnFilePrintPreview() {
// 確保已載入完成
if (m_pBrowserApp == nullptr) return;
// 方式一:直接呼叫 WebBrowser 的列印預覽
VARIANT vIn = {VT_EMPTY}, vOut = {VT_EMPTY};
HRESULT hr = m_pBrowserApp->ExecWB(
OLECMDID_PRINTPREVIEW,
OLECMDEXECOPT_DONTPROMPTUSER | OLECMDEXECOPT_PROMPTUSER,
&vIn, &vOut
);
if (FAILED(hr)) {
AfxMessageBox(_T("列印預覽失敗"));
}
}
// 若需自訂頁眉/頁尾/邊距,需用 IWebBrowser2->put_RegisterAsBrowser/put_RegisterAsDropTarget
// 更細粒度控制參考:https://www.codeproject.com/Articles/967/WebBrowser-Control-How-to-Print-Preview
OnDocumentComplete 後才能呼叫列印 API。charset=utf-8,列印模板亦為 UTF-8。IWebBrowser2::ExecWB 方法文件別試圖用 CView 的列印架構去套 CHtmlView,走 ActiveX 原生介面才是正途。