如何在输出期间将 GDI CDC 打印配置更改为双面打印?

问题描述 投票:0回答:1

我有可用于生成打印机输出的 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();

打印过程中可以切换到双面模式吗?我有什么错吗?

c++ printing gdi
1个回答
0
投票

要切换到双面模式,您可能需要在开始之前执行该操作,该“页面”将位于该纸的正面。

至于序列的其余部分,您的设置足够正确,可以在许多打印机驱动程序中正常工作。通过让你的代码更加迂腐一点,你可以避免更复杂的驱动程序出现问题。

当你摆弄 DEVMODE 时,你应该:

  • 检查 dmFields 位掩码以确保 DEVMODE 支持对该字段的更改。
  • 不要获取新的、未经验证的 DEVMODE(我认为这就是您调用 dlg.GetDevMode 时发生的情况)。保留经过验证的 DEVMODE 的副本(包括驱动程序的私有数据)。对此进行更改。
  • 通过调用 DocumentProperties 重新验证 DEVMODE。这使打印机驱动程序有机会调整相关(可能是私有)字段,以与您所做的更改保持一致。
  • 然后在调用 ResetDC 时使用重新验证的 DEVMODE。

司机有越野车

以上仍然可能无法解决您的问题。根据我的经验,一些工作中的 DEVMODE 更改根本不适用于某些驱动程序。

一个常见的例子是尝试在页面之间切换纵向和横向。它根本不适用于某些打印机驱动程序,但适用于其他打印机驱动程序。在某些地方它主要起作用,但某些与方向相关的值和功能,例如可打印区域的偏移或设备分辨率(对于不使用“方形”像素的打印机),可能不会全部一致更新。

另一个例子是尝试在页面之间更换纸盒。例如,如果您希望将文档的第一页打印在从手动进纸器或辅助纸盘送入的自定义信笺上,并让其余页面使用默认纸盘中的普通纸,则它可以在许多情况下正常工作。打印机,但与其他打印机完全不一样。

在越野车司机周围工作

在我开发的一个商业产品中,我们维护了一个配置文件,其中包含无法正确支持某些功能的打印机驱动程序列表,即使当您通过 API 查询它们或检查其 DEVMODE 时它们声称支持。当需要行使该功能时,代码将查阅异常,例如并使用粗略的后备。

最常见的后备方案是将工作分解为多个工作。如果前几页应该为纵向,然后一页为横向,然后其余页面为纵向,我们只需将其分成三个打印作业并按顺序发送即可。在某些情况下这并不理想,但损坏的打印机驱动程序并没有给我们留下太多选择。

双面打印的一个可能的技巧是始终创建双面作业,并且当您不想在背面打印时,只需打印空白页。再说一遍,这并不理想,但是你要做什么?

© www.soinside.com 2019 - 2024. All rights reserved.