如何通过GDI打印实现双面打印API

how to implement duplex printing via GDI Print API

我需要在打印机上实现双面打印。我使用 dmDuplex 参数

在打印机驱动程序中设置 DEVMODE 结构
int dvmSize=DocumentProperties(GetForegroundWindow(),hPrinter,(LPWSTR)(printerName.c_str()),NULL,NULL,0);
DEVMODE *dvmSettings = (DEVMODE*) GlobalAlloc(GPTR,dvmSize);
DEVMODE *dvMode = (DEVMODE*) GlobalAlloc(GPTR,dvmSize);
DocumentProperties(GetForegroundWindow(),hPrinter,(LPWSTR)(printerName.c_str()),dvmSettings,NULL,DM_OUT_BUFFER);
dvmSettings->dmDuplex=DMDUP_HORIZONTAL;
dvmSettings->dmFields=DM_DUPLEX;
DocumentProperties(GetForegroundWindow(),hPrinter,(LPWSTR)(printerName.c_str()),dvMode,dvmSettings,DM_IN_BUFFER|DM_OUT_BUFFER);

据我了解,有2种实现方式。通过 WritePrinter 或使用 CreateDC 创建 HDC 传递 dvMode 并直接绘制到上下文。第二种方式对我来说更方便,但它行得通吗?我问是因为我现在无法测试它,我需要知道它是否有效。

就我而言,它会起作用。

您可以调用CreateDC or PrintDlgEx函数获取打印机DC。

如果您的应用程序调用 CreateDC 函数,它必须提供驱动程序和端口名称。要检索这些名称,请调用 GetPrinter or EnumPrinters 函数。

如果您的应用程序调用 PrintDlgEx 函数并在 PRINTDLGEX structure 的 Flags 成员中指定 PD_RETURNDC 值,则系统 returns 所选打印机的设备上下文句柄由用户。

更多细节我建议你可以参考文档:

  1. https://docs.microsoft.com/en-us/windows/win32/printdocs/sending-data-directly-to-a-printer

  2. https://docs.microsoft.com/zh-cn/windows/win32/printdocs/gdi-printing

  3. https://docs.microsoft.com/en-us/windows/win32/printdocs/printer-output

  4. https://docs.microsoft.com/zh-cn/windows/win32/dlgbox/using-common-dialog-boxes