YStudio Y++

打印类

Y++ / YStudio 开发文档 · 一点滴

类对象支持库。路径:支持库 → 扩展类库 → 打印类。

类型名写「打印类」。声明时自动创建。

按页输出文本、表格、图片(Win32 GDI)。坐标与页边距单位为 百分之一毫米(HIMETRIC,0.01mm;例如 1000 = 10mm)。

另支持 原始字节通道(打开原始 / 发送原始):经系统打印机 WritePrinter、datatype=RAW,可发 ESC/POS、ZPL 等任意协议。与 GDI 打开 / 画布互斥;v1 仅同步。小票语义请用 小票类。

在 IDE 里开通打印类后才能编译。编进用户程序之后,运行时不再检查授权。能力包:plugins/supportlib.print/(须在 YStudio.exe 旁 plugins/,重启 IDE 后出现在 支持库 → 扩展类库 → 打印类)。

无内置预览窗。 用「画布 + 取画布图片」自己做预览(如放到图片框);用「异步 + 是否完成」避免关闭时卡界面。

无内置设置窗。 用「取默认打印机 / 取纸张列表 / 置纸张·方向·份数·双面·彩色 + 应用设置」自己做设置页;选择打印机() 仍可作系统对话框备用。

完整示例工程:examples/打印预览(图片框 DIY 预览 + 同步/异步打印)。

自定义打印设置

打印类 打
文本 机 = 打.取默认打印机()
文本 纸张们 = 打.取纸张列表(机)   // 填到自建下拉;非空机名会记为当前打印机

打.置纸张("A4")
打.置方向(0)           // 0纵 1横
打.置份数(1)
打.置双面(0)           // 0关 1长边 2短边
打.置彩色(真)
如果 (!打.应用设置()) {
    信息框(打.取错误(), 0)
    返回
}
// 此时可取可打宽度/纸张宽高等;再打开画布或打开作业
如果 (打.打开画布("", 0)) {
    // …同一套输出…
    打.关闭()
}

改选项后请先 应用设置()(或直接 打开/打开画布,有未应用改动时会自动应用)。双面不被驱动接受时,其余项仍会应用,并用 取错误() 提示。

预览与实打一致(重要)

打开画布 会按目标打印机的物理纸张、DPI、不可打边距建图,原点/可打区域算法与 打开() / 选择打印机() 相同;再配上同一套输出命令,预览与实打对齐。

推荐:

  1. 先确定打印机(选择打印机() 或记下打印机名)
  2. 打开画布(打印机名) 或名空(用已选/默认),dpi 填 0(跟打印机分辨率)
  3. 同一套 开始页 / 输出* / 结束页 画预览
  4. 取画布图片() → 图片框
  5. 真正打印时对同一打印机再跑一遍同一套输出(可抽成子程序)

dpi>0 仅作降采样加快预览,可能有细微差别,正式预览请用 0。

打印类 打
打.置字体("微软雅黑", 10)
打.置页边距(1000, 1000, 1000, 1000)

函数 画一页() {
    打.开始页()
    打.输出文本行("对账单", 14)
    打.输出表格(0, 打.取游标Y(), "品名\t数量\n苹果\t2", 2500)
    打.结束页()
}

// —— 预览 ——
如果 (打.打开画布("", 0)) {     // 默认打印机,DPI 跟机
    画一页()
    图片框1.图片 = 打.取画布图片()
    打.关闭()
}

// —— 实打 ——
如果 (打.打开()) {
    画一页()
    打.关闭()
}

仓库示例:examples/打印预览(启动即刷新预览;可改标题/备注后再刷新)。

异步打印

打印类 打
打.异步(真)
打.置文档名("对账单")
如果 (打.选择打印机()) {
    打.开始页()
    打.输出文本行("标题", 14)
    打.结束页()
    打.关闭()                 // 立刻返回,后台回放到打印机
}
// 定时器里:
如果 (打.是否完成()) {
    如果 (打.取错误() != "") {
        信息框(打.取错误(), 0)
    }
}

异步(真) 时:打开/选择打印机只准备作业,输出命令先录制;关闭() 在后台线程创建打印机 DC 并回放。对话框仍在 UI 线程弹出。

同步快速开始

打印类 打
如果 (打.打开()) {
    打.开始页()
    打.输出文本行("对账单", 14)
    打.结束页()
    打.关闭()
} 否则 {
    信息框(打.取错误(), 0)
}

原始指令(RAW)

与 GDI「打开」不同:这里把你给的字节原样交给驱动(datatype=RAW),适合 ESC/POS、ZPL 等。小票语义(对齐、切纸、二维码)请优先用 小票类;本通道是「通用水管」。

打印类 打
如果 (!打.打开原始("XP-58")) {   // 空=默认打印机
    信息框(打.取错误(), 0)
    返回
}
打.发送原始(十六进制到字节集("1B40"))          // 复位
打.发送原始(文本到字节集("Hello", 3))          // 3=GBK
打.发送原始(十六进制到字节集("0A1D5600"))      // 换行+切纸(视机型)
打.关闭()
  • 驱动须支持 RAW;失败看 取错误。
  • 网口/串口热敏、本机 ESC/POS 模拟器:用小票类 打印到网口("127.0.0.1", 9100),不必走系统打印机队列。
  • Windows 模拟预览见 receipt.md · 推荐测试路径。

命令摘要

方法 说明
异步(启用) / 是否完成() 后台打印与轮询
打开画布([打印机名], [dpi=0]) 按该机纸张/DPI 建画布;dpi 0=跟机
取画布图片() PNG 字节集(DIY 预览)
打开([打印机名]) / 选择打印机() 打开 GDI 作业
打开原始([打印机名]) / 发送原始(字节集) RAW 通道(任意协议)
取打印机列表() / 取默认打印机() 打印机
取纸张列表([打印机名]) 可用纸张名
置/取纸张 置/取方向 置/取份数 置/取双面 置/取彩色 自定义设置项
应用设置() 写入 DEVMODE 并刷新度量
置文档名 / 置页边距 / 置字体 作业与版式
取可打宽度/高度 / 取纸张宽度/高度 度量(0.01mm;应用设置后即可取)
置游标 / 取游标X/Y 流式排版;开始页 重置
开始页 / 结束页 分页
输出文本 / 输出多行文本 / 量文本高度 / 输出文本行 文本
输出图片 / 输出表格 图片与表格(表格返回占用高度)
关闭() 提交 / 启动后台 / 释放画布
取错误() 最近失败原因(含后台)

返回高度的方法成功为占用高度(≥1),失败为 0。