我有一个由两部分组成的问题.我需要添加支持打印到现有的基于对话框的MFC项目.正在打印的文档是使用HTML组成的.我知道我可以添加基于HTML的对话框,但是如何添加打印功能呢?
PS.我需要这个能够根据程序的需要设置打印页面大小.
解决方法:
受到excellent Marc’s Durdin’s article的启发,我做了更多的探索.
实际上似乎有一种更简单的方法来提供自定义DEVMODE和DEVNAMES并在不使用HTML对话框或自定义IE print template的情况下进行打印.这反过来应该允许设置自定义打印机,纸张大小,方向等.
我在C中有一个操场WebBrowser ActiveX主机项目,类似于this.我在我的OLE站点对象(IOleClientSite)上实现了IOleCommandTarget接口.现在这是有趣的部分,当调用打印时(通过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)
我还没有进一步考虑,但我认为应该可以改变它们中的任何一个并从IOleCommandTarget :: Exec返回S_OK,并期望浏览器控件接受更改.
我希望它在IDM_PRINTPREVIEW/OLECMDID_PRINTPREVIEW2中以类似的方式工作,但我还没有验证.随着时间的推移,我会更多地玩这个.同时,欢迎您试用并分享您的结果.
标签:c,printing,windows,winapi,mfc
来源: https://codeday.me/bug/20190929/1832695.html