|
|
发表于 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 |
|
谢谢,还是以自己的方法解决了! |
查看全部评分
|