我有一个由两部分组成的问题。我需要添加支持打印到现有的基于对话框的MFC项目。正在打印的文档是使用HTML组成的。我知道我可以添加基于HTML的对话框,但是如何添加打印功能呢?
PS。我需要这个能够根据程序的需要设置打印页面大小。
答案 0 :(得分:1)
受到excellent Marc's Durdin's article的启发,我做了更多的探索。
实际上似乎有一种更简单的方式来提供自定义DEVMODE
和DEVNAMES
并在不使用HTML对话框或自定义IE print template的情况下进行打印。反过来,这应该允许设置自定义打印机,纸张大小,方向等。
我在C ++中有一个游乐场WebBrowser ActiveX主机项目,类似于this。我在我的OLE站点对象(IOleCommandTarget
)上实现了IOleClientSite
接口。现在这是有趣的部分,当调用打印时(通过Ctrl-P或通过IDM_PRINT),浏览器控件将网站对象回调为IOleCommandTarget::Exec(&CGID_DocHostCommandHandler, OLECMDID_PRINT2, &VARIANT(VT_UNKNOWN), NULL)
。第3个参数包含一个以IUnknown
传递的对象,但在查询IDispatch
时,它支持所有相同的__IE_*
properties,可通过IDispatch::Invoke
获得:
__IE_TemplateUrl (VT_EMPTY)
__IE_ParentHWND (VT_UINT)
__IE_HeaderString (VT_BSTR)
__IE_FooterString (VT_BSTR)
__IE_OutlookHeader (VT_UNKNOWN)
__IE_BaseLineScale (VT_INT)
__IE_uPrintFlags (VT_UINT)
__IE_ContentDocumentUrl (VT_BSTR)
__IE_ContentSelectionUrl (VT_BSTR)
__IE_PrinterCMD_Printer (VT_BSTR)
__IE_PrinterCMD_Device (VT_BSTR)
__IE_PrinterCMD_Port (VT_BSTR)
__IE_BrowseDocument (VT_UNKNOWN)
__IE_TemporaryFiles (VT_ARRAY)
__IE_PrinterCMD_DevNames (VT_I4)
__IE_PrinterCMD_DevMode (VT_I4)
__IE_PrintType (VT_BSTR)
我还没有采取进一步的措施,但我认为应该可以更改其中的任何内容并从S_OK
返回IOleCommandTarget::Exec
,并期望浏览器控件接受更改。
我希望IDM_PRINTPREVIEW / OLECMDID_PRINTPREVIEW2以类似的方式工作,但我还没有确认。随着时间的推移,我会更多地玩这个。同时,欢迎您试用并分享您的结果。