开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 181|回复: 3
收起左侧

[已解决] 请问打印机是如何获得页面最大尺寸?

 关闭 [复制链接]
结帖率:100% (34/34)
发表于 2026-1-31 18:37:34 | 显示全部楼层 |阅读模式   广东省惠州市
500精币
在写一个打印机类,问了AI都给不出正确的答案,如下图,想按打印范围居中打印的.发现没有API能获得页面最大尺寸.
    // _获取页面宽度
    double _获取页面宽度() {
        if (!_打印机DC) return 0;
        return GetDeviceCaps(_打印机DC, HORZRES);
    }
    // _获取页面高度
    double _获取页面高度() {
        if (!_打印机DC) return 0;
        return GetDeviceCaps(_打印机DC, VERTRES);
    }
上面的函数是AI给写的,发现只是可打印范围,没有页面尺寸.如下图效果
1.png

2.png

3.png

     int _获取物理宽度() {
        if (!_打印机DC) return 0;
        return GetDeviceCaps(_打印机DC, PHYSICALWIDTH);
    }
   
    int _获取物理高度 () {
        if (!_打印机DC) return 0;
        return GetDeviceCaps(_打印机DC, PHYSICALHEIGHT);
    }

用这两个代码也是不对的.也只是范围可打印范围,不是页面最大范围.
难道,要我依下面代码.胡乱猜测剩下多少吗?
12.png

11.png

最佳答案

查看完整内容

简单说,你之前的问题就是没找对获取“整张纸大小”的方法,还踩了“单位不匹配”的坑——AI给的代码只能拿到“能写字的区域”(不是整张纸),导致画的框不对、居中也偏。下面用大白话教你一步一步解决: 先搞懂2个关键问题(不用记术语,知道区别就行) 1. **你要的是“整张纸”,不是“能写字的地方”** 打印机的纸(比如A4)边缘有一点点地方是硬件印不到的(叫“边距”)。之前用的 `HORZRES/VERTRES` 只能拿到“能写字 ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值
结帖率:100% (3/3)

签到天数: 4 天

发表于 2026-1-31 18:37:35 | 显示全部楼层   贵州省遵义市
简单说,你之前的问题就是没找对获取“整张纸大小”的方法,还踩了“单位不匹配”的坑——AI给的代码只能拿到“能写字的区域”(不是整张纸),导致画的框不对、居中也偏。下面用大白话教你一步一步解决:

先搞懂2个关键问题(不用记术语,知道区别就行)
1. **你要的是“整张纸”,不是“能写字的地方”**  
   打印机的纸(比如A4)边缘有一点点地方是硬件印不到的(叫“边距”)。之前用的 `HORZRES/VERTRES` 只能拿到“能写字的区域”(比整张纸小),而 `PHYSICALWIDTH/PHYSICALHEIGHT` 才是拿“整张纸真实大小”的正确方法。

2. **单位要统一,不然尺寸会乱**  
   打印机返回的“整张纸大小”单位是“0.01毫米”(比如A4纸是210mm宽,返回值就是21000),但你画图时用的是“像素”或“0.1毫米”这种单位——不换算的话,画出来的框要么太大要么太小。

直接能用的解决步骤(对着改代码就行)
第一步:换2个“拿整张纸大小”的函数
把你原来的 `_获取页面宽度()` 和 `_获取页面高度()` 删掉,换成这2个(作用是直接拿到整张纸的真实尺寸,单位是毫米,好理解):
```cpp
// 拿整张纸的宽度(毫米)
double _获取整张纸宽度() {
    if (!_打印机DC) return 0;
    // 把打印机返回的“0.01毫米”转换成“毫米”(除以100)
    return GetDeviceCaps(_打印机DC, PHYSICALWIDTH) / 100.0;
}

// 拿整张纸的高度(毫米)
double _获取整张纸高度() {
    if (!_打印机DC) return 0;
    return GetDeviceCaps(_打印机DC, PHYSICALHEIGHT) / 100.0;
}
```

#### 第二步:把“毫米”转换成你画图能用的单位
假设你画图时用的是“0.1毫米”(大部分中文编程工具默认这个),加一个转换函数(简单说就是“1毫米 = 10个画图单位”):
```cpp
// 毫米转画图单位(比如210毫米的A4纸,转完就是2100个单位)
int _毫米转画图单位(double 毫米数) {
    return (int)(毫米数 * 10); // 要是你用的是“0.01毫米”,就改成×100
}
```

第三步:改画图逻辑,按“整张纸”居中画
原来的代码是按“能写字的区域”算的,现在换成“整张纸”的尺寸,步骤不变,只换参数:
```cpp
// 原来的入口函数里,改成这样:
int 入口函数_窗口() {
    HH类_打印机 打印机;
    if (!打印机._连接默认打印机()) return 0;
    打印机._设置标准纸张尺寸(打印机.纸张_A4); // 选A4纸(其他纸也一样)
   
    if (打印机._开始打印("打印文档")) {
        if (打印机._开始新页()) {
            // 1. 先拿到整张纸的真实尺寸(毫米)
            double 纸宽 = 打印机._获取整张纸宽度(); // A4纸这里会是210.0毫米
            double 纸高 = 打印机._获取整张纸高度(); // A4纸这里会是297.0毫米
            
            // 2. 转换成画图能用的单位
            int 画图宽 = 打印机._毫米转画图单位(纸宽); // 210×10=2100
            int 画图高 = 打印机._毫米转画图单位(纸高); // 297×10=2970
            
            // 3. 居中画“产品展示”(垂直居中就是“纸的一半高度”)
            打印机._绘制文本_居中(画图高 / 2, "产品展示", "微软雅黑", 20);
            
            // 4. 画红色边框(紧贴整张纸边缘,x=0,y=0就是纸的左上角)
            打印机._绘制矩形(0, 0, 画图宽, 画图高, 2, false, RGB(255,0,0));
            
            打印机._结束当前页();
        }
        打印机._结束打印();
    }
    return 0;
}
```

最后验证一下(确保没出错)
如果是A4纸,改完后调试输出应该是:
- 纸宽:210.0 毫米,画图宽:2100
- 纸高:297.0 毫米,画图高:2970

画出来的红色框会刚好贴住纸的四边,“产品展示”会在纸的正中间,再也不会出现“框画不全”“居中偏移”的问题了。

要是还不对,就查2个地方
1. 是不是单位没选对?如果你的画图单位是“像素”或“英寸”,就改 `_毫米转画图单位` 里的倍数(比如1毫米≈3.78像素,就改成×3.78);
2. 是不是打印机开了缩放?去打印机设置里把“缩放比例”改成100%,别让打印机自动缩小/放大。

评分

参与人数 2好评 +1 精币 +3 荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!
呵呵仙 + 1 + 3 谢谢,还是以自己的方法解决了!

查看全部评分

回复

使用道具 举报

结帖率:100% (1/1)
发表于 2026-1-31 18:55:42 | 显示全部楼层   浙江省温州市
你可以参考一下易语言中的打印机。
它是有绘画单位的,默认也不是像素:
0.png
回复

使用道具 举报

发表于 2026-1-31 20:41:04 | 显示全部楼层   **
{:7_460:}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表