GDI 打印 API(StartDocA / StartPage / EndPage / EndDoc)

这是 图形设备接口 (GDI) 提供的打印方式:

  • 调用路径

    HDC hdc = CreateDCA("WINSPOOL", "打印机名", NULL, devmode);
    StartDocA(hdc, &di);
    StartPage(hdc);
    // GDI 绘制(TextOut, BitBlt, LineTo, Rectangle...)
    EndPage(hdc);
    EndDoc(hdc);
    DeleteDC(hdc);
    

  • 特点

    • 你得到一个 打印机的 HDC(设备上下文),就像画布一样。

    • 你用 GDI 函数画文字、图形、图片,GDI 会转换成打印机能理解的数据(可能是 EMF,可能是光栅图像,取决于驱动)。

    • 驱动层负责把图形转换成打印机语言(PCL、PostScript、ESC/POS 等)。

    • 程序不用关心打印机的命令语言。

    • 缺点:可控性有限,效率比“写原始数据”低。


原始打印 API(StartDocPrinter / StartPagePrinter / WritePrinter / EndPagePrinter / EndDocPrinter)

这是 打印后台处理程序(Spooler API),绕过 GDI,直接往打印机端口写数据:

  • 调用路径

    HANDLE hPrinter;
    OpenPrinter("打印机名", &hPrinter, NULL);
    
    DOC_INFO_1A di = {0};
    di.pDocName = "My Raw Document";
    di.pDatatype = "RAW";  // 原始数据,不经 GDI 处理
    
    StartDocPrinter(hPrinter, 1, (LPBYTE)&di);
    StartPagePrinter(hPrinter);
    
    // 直接写打印机命令(PCL、ZPL、ESC/POS 等)
    const char* data = "^XA^FO50,50^ADN,36,20^FDHello ZPL!^FS^XZ"; 
    DWORD written;
    WritePrinter(hPrinter, data, strlen(data), &written);
    
    EndPagePrinter(hPrinter);
    EndDocPrinter(hPrinter);
    ClosePrinter(hPrinter);
    

  • 特点

    • 不做 GDI 绘图,直接发数据。

    • 你要自己知道打印机的语言(PCL, ZPL, ESC/POS...)。

    • 速度快、控制精确,适合条码机、票据打印机等。

    • 如果你传 "RAW",数据会直接下发,不会经过驱动渲染。


🔍 对比总结

API 使用对象 数据格式 适用场景
StartDocA / StartPage / EndPage / EndDoc GDI(HDC) GDI 绘制指令(驱动转换) 通用打印(Word、图片、Office 程序等)
StartDocPrinter / StartPagePrinter / WritePrinter 打印机句柄(Spooler API) 你自己写的原始命令(PCL/ZPL/ESC/POS) 条码机、热敏小票机、专用打印控制

举例

  • 如果你打印一张条形码:

    • 用 GDI API:你自己画矩形、画线、填充,GDI 转换成点阵图给打印机。

    • 用 Raw API:你直接发 ZPL/ESC/POS 命令,打印机自己画条码。


你现在说的 StartDocA/StartPage 打印条码,说明你走的是 GDI 路径
如果你的打印机本身是条码机,支持 ZPL/ESC/POS,用 StartDocPrinter + WritePrinter 会更快、更精准。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐