我有可用于生成打印机输出的 C++ 代码(准/缩写代码):
CDC dcPrinter;
dcPrinter.Attach(hdcPrinter);
DOCINFO docinfo;
dcPrinter.StartDoc(&docinfo);
dcPrinter.StartPage();
dcPrinter.TextOut(leftMarginPlus, 490, _T("Normal report text"));
dcPrinter.EndPage();
我需要的是在报告的末尾切换到双面模式,然后仅在最后一页的背面打印一些细则/披露信息。我已经尝试过,但输出没有切换到双面打印〜它只是在另一个新页面上打印“正常”:
dcPrinter.EndPage();
DEVMODE* dvmd = dlg.GetDevMode();
GlobalLock(dvmd);
dvmd->dmDuplex = DMDUP_VERTICAL;
dvmd->dmFields |= DM_DUPLEX;
GlobalUnlock(dvmd);
dcPrinter.ResetDCW(dvmd);
dcPrinter.StartPage();
dcPrinter.TextOut(leftMargin, 490, _T("all the Fine-Print"));
dcPrinter.EndPage();
打印过程中可以切换到双面模式吗?我有什么错吗?
要切换到双面模式,您可能需要在开始之前执行该操作,该“页面”将位于该纸的正面。
至于序列的其余部分,您的设置足够正确,可以在许多打印机驱动程序中正常工作。通过让你的代码更加迂腐一点,你可以避免更复杂的驱动程序出现问题。
当你摆弄 DEVMODE 时,你应该:
以上仍然可能无法解决您的问题。根据我的经验,一些工作中的 DEVMODE 更改根本不适用于某些驱动程序。
一个常见的例子是尝试在页面之间切换纵向和横向。它根本不适用于某些打印机驱动程序,但适用于其他打印机驱动程序。在某些地方它主要起作用,但某些与方向相关的值和功能,例如可打印区域的偏移或设备分辨率(对于不使用“方形”像素的打印机),可能不会全部一致更新。
另一个例子是尝试在页面之间更换纸盒。例如,如果您希望将文档的第一页打印在从手动进纸器或辅助纸盘送入的自定义信笺上,并让其余页面使用默认纸盘中的普通纸,则它可以在许多情况下正常工作。打印机,但与其他打印机完全不一样。
在我开发的一个商业产品中,我们维护了一个配置文件,其中包含无法正确支持某些功能的打印机驱动程序列表,即使当您通过 API 查询它们或检查其 DEVMODE 时它们声称支持。当需要行使该功能时,代码将查阅异常,例如并使用粗略的后备。
最常见的后备方案是将工作分解为多个工作。如果前几页应该为纵向,然后一页为横向,然后其余页面为纵向,我们只需将其分成三个打印作业并按顺序发送即可。在某些情况下这并不理想,但损坏的打印机驱动程序并没有给我们留下太多选择。
双面打印的一个可能的技巧是始终创建双面作业,并且当您不想在背面打印时,只需打印空白页。再说一遍,这并不理想,但是你要做什么?