65.9K
CodeProject 正在变化。 阅读更多。
Home

WebBrowser 控件:如何进行打印预览

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (19投票s)

2001 年 2 月 9 日

viewsIcon

391917

downloadIcon

4655

将 WebBrowser 控件插入到对话框中,并通过实现 IOleCommandTarget 接口向其添加打印预览功能。

Sample Image - wbp.jpg

引言

WebBrowser 控件广泛用于在 MFC 或 Windows Forms 应用程序中显示网页。该控件具有超出您想象的功能 - 例如,打印预览。如果您一直在使用 IE 5.5 或更高版本,您可能已经见过打印预览窗口。它是 WebBrowser 控件的一部分。如果您使用过 CHtmlView,您也应该了解此功能。您可能已经认识到此预览窗口与传统的 MFC 打印预览无关。本文向您展示了在 WebBrowser 控件中使用打印预览和页面设置是多么简单。要求是安装了 IE 5.5 或更高版本。

添加打印预览功能

在打印预览方法中,我首先验证 WebBrowser 控件是否有效。然后,我检索指向 HTMLDocumentIDispatch 接口指针,从中查询 IOleCommandTarget 接口,并将指针存储在 lpTarget 中。您可以在 MSDN 中找到有关 IOleCommandTarget 接口的信息。我不会在这里重复这些说明。最后,我通过使用适当的参数调用 IOleCommandTarget::Exec 来执行打印预览命令。命令 ID OLECMDID_PRINTPREVIEW 在 "docobj.h" 中定义。打印预览的 GUI 由 WebBrowser 控件处理。

以下是该方法的源代码

void CWBPDlg::OnDemoPrintpreview() 
{
    // Verify the WebBrowser control is valid.
    LPDISPATCH lpDispApp = m_wndBrowser.GetApplication();
    if(lpDispApp)
    {
        // Get the HTMLDocument interface.
        LPDISPATCH lpDispDoc = m_wndBrowser.GetDocument();
        if (lpDispDoc != NULL)
        {
            // Get the IOleCommandTarget interface so that 
            // we can dispatch the command.
            LPOLECOMMANDTARGET lpTarget = NULL;
            if (SUCCEEDED(lpDispDoc->
                  QueryInterface(IID_IOleCommandTarget,
                                     (LPVOID*) &lpTarget)))
            {
                // Execute the print preview command. The 
                // control will handle the print preview
                // GUI.
                // OLECMDID_PRINTPREVIEW is defined in
                // "docobj.h".
                lpTarget->Exec(NULL,
                    OLECMDID_PRINTPREVIEW, 0, NULL, NULL);
                lpTarget->Release();
            }
            lpDispDoc->Release();
        }
        lpDispApp->Release();
    }
}

现在您可以编译并运行该应用程序。打印预览的 GUI 与您在 IE 中看到的相同。

使用 WebBrowser::ExecWB 方法 - Alexander Tsarfin 的贡献

WebBrowser 类实现了一个包装器,允许您使用 IOleCommandTarget::Exec 方法在 OLE 对象上执行命令。

void CWBPDlg::OnDemoPrintpreview()
{
    m_wndBrowser.ExecWB(OLECMDID_PRINTPREVIEW,
                    OLECMDEXECOPT_PROMPTUSER, NULL, NULL);
}

添加页面设置

使用相同的模式,以下函数将打开页面设置对话框

void CWBPDlg::OnPagesetup()
{
    m_wndBrowser.ExecWB(OLECMDID_PAGESETUP, OLECMDEXECOPT_PROMPTUSER, NULL, NULL);
}

结论

以上两种方法做的是相同的工作 - 一种使用 COM 接口,另一种使用精美包装的方法。如果您更进一步,您将找到在 docobj.h 中定义的其他 OLE 命令 ID。一旦您获得了 IOleCommandTarget 接口,您就可以轻松地使用它们。这超出了本文的范围。

修订历史

  • 2002 年 6 月 26 日 - 重新格式化代码以防止滚动。
  • 2005 年 3 月 20 日 - 添加了页面设置对话框。
© . All rights reserved.