使用Printer打印,同样的代码、同一台打印机、不同的电脑打印效果居然不一样,why?

时间:2021-05-29 10:48:56
打印函数如下:
Sub printOurP2(ByVal page As Integer)
'套打票据二
On Error GoTo haveErr
Dim tmp As SellProduct
Dim i As Integer
Dim tmpA As Single
Dim tmpM As Currency
Dim rowheight As Single
        '打印自定义的票据       
        Printer.Scale
        'Printer.PaperSize = vbPRPSUser
        Printer.FontSize = 15
        Printer.ScaleHeight = 132 * 56.7
        Printer.ScaleWidth = 191 * 56.7
        'Printer.Zoom = 100
        
       ' Printer.Width = 56.7 * 191
       ' Printer.Height = 56.7 * 132
       ' Printer.FontSize = 15
        '打印日期
        Printer.CurrentX = 56.7 * 148: Printer.CurrentY = 56.7 * 19: Printer.Print Right(Year(Date), 2)        '打印两位年编号
        Printer.CurrentX = 56.7 * 160: Printer.CurrentY = 56.7 * 19: Printer.Print Month(Date)                 '打印月份
        Printer.CurrentX = 56.7 * 170: Printer.CurrentY = 56.7 * 19: Printer.Print Day(Date)    '打印日期
                
        If Not NowMember Is Nothing Then        '有会员,打印会员编号及姓名
               Printer.CurrentX = 56.7 * 37: Printer.CurrentY = 56.7 * 25: Printer.Print NowMember.bh
               Printer.CurrentX = 56.7 * 72: Printer.CurrentY = 56.7 * 25: Printer.Print NowMember.Name
        End If
        rowheight = 6
        i = 0
        For i = 0 To 9
                If i + 1 + page * 10 > NowSell.Products.Count Then Exit For
                Set tmp = NowSell.Products(i + 1 + page * 10)
                tmpA = tmpA + tmp.Amount
                tmpM = tmpM + tmp.Money
                Printer.CurrentX = 56.7 * 17: Printer.CurrentY = 56.7 * (43 + i * rowheight): Printer.Print tmp.Name         '打印商品名称
                Printer.CurrentX = 56.7 * 62: Printer.CurrentY = 56.7 * (43 + i * rowheight): Printer.Print tmp.Spcd          '打印单位
                Printer.CurrentX = 56.7 * 95: Printer.CurrentY = 56.7 * (43 + i * rowheight): Printer.Print tmp.Unit         '打印单位
                Printer.CurrentX = 56.7 * 109: Printer.CurrentY = 56.7 * (43 + i * rowheight): Printer.Print tmp.Amount         '打印数量
                Printer.CurrentX = 56.7 * 126: Printer.CurrentY = 56.7 * (43 + i * rowheight): Printer.Print Format(tmp.price, "0.00")        '打印单价
                Printer.CurrentX = 56.7 * 148: Printer.CurrentY = 56.7 * (43 + i * rowheight): Printer.Print Format(tmp.Money, "0.00")          '打印金额
        Next
                
        Printer.CurrentX = 56.7 * 109: Printer.CurrentY = 56.7 * 104: Printer.Print tmpA                 '打印本单总数量
        Printer.CurrentX = 56.7 * 148: Printer.CurrentY = 56.7 * 104: Printer.Print Format(tmpM, "0.00")
        Printer.EndDoc
        If (page + 1) * 10 < NowSell.Products.Count Then printOurP2 page + 1
        
Exit Sub

haveErr:
  isPrint = False
  WP = False
End Sub

上面打函数打印,同样的代码、同一台打印机、不同的电脑打印效果居然不一样。好像是会继承打印机的某项默认设置来打印,我尝试修改了不少Printer属性没有反应。

有人能指点一下么?

20 个解决方案

#1


两台电脑的操作系统不一样吧:
肯定一太win9X,另一台是win2000或XP
基于NT核心的打印直接用pinter设置是无效的

#2


to microtry(土炮) :
一台是XP,一台是2000

#3


效果到底差别在什么地方?

#4


操作系统不一样是有时有差别。

#5


按比例放大,一个台电脑大,一台电脑小。

#6


我仔细看了一下
你的代码好像没有显式的说明坐标尺度的计量单位
你所有的尺寸设置就可能代有不确定性(不是绝对值如:厘米或缇),
例如:如果尺寸的参照系是显示象素,那么换一台
电脑的话,就会大小不一了

#7


to microtry(土炮) :
试过,设为匙或毫米都试过。

#8


/关注/

#9


/关注/

#10


Printer.ScaleMode = vbMillimeters '设置座标模式为毫米
Printer.PaperSize = vbPRPSA3 '设置纸张大小
Printer.Orientation = vbPRORPortrait '设置打印方向为纸向

设置纸张宽度或者高度的时候,不要使用ScaleWidth或者ScaleHeight,其与WIDTH和HEIGHT的具体区别请见MSDN。

我用PRINTER做过在98、2000及XP下的打印,打印位置可能会有一些细微的误差,但不会出现你说的整体放大或者缩小,出现你说的这种情况,具我估计就是你用ScaleWidth或者ScaleHeight设置的宽度和高度的比例造成的。

你可以写个简单的程序测试一下,比如只画几条线,再打几个字,只用WIDTH/HEIGHT设置纸张的大小,用Printer.ScaleMode = vbMillimeters 设置座标模式为毫米,测试一下。其他的设置先不用。

#11


如果使用不带参数的 Scale(两组坐标都省略),坐标系统将重置为缇。

 (ScaleWidth) 或 (ScaleHeight)用来描述坐标 度量单位

为了定义基于标准度量单位的比例尺,例如缇、像素、毫米或厘米
应使用 ScaleMode 属性。

把其它任何 Scale 属性设置为任何值都将使 ScaleMode 自动地设置为 0。
ScaleMode 等于 0 是用户定义。


把 ScaleMode 设置为一个大于 0 的数,
将使 ScaleHeight 和 ScaleWidth 的度量单位发生改变,
并将 ScaleLeft 和 ScaleTop 设置为 0。
另外,CurrentX 和 CurrentY 的设置值将发生改变以反映当前点的新坐标。 

以上帮助希望对楼主有用
同意楼上的思路,虽然你设置了绝对尺寸
可是你不能确定你的语句真的会产生你预期的效果
你要先测试一下

#12


关注

#13


删除打印机重装后,两台电脑效果都一样. 也就是说没办法在程序里面设置,使得在不同的打印机上效果一致.

打印内容也是随着页面比例放大的. 有什么解决办法吗?

#14


是不是系统不一样啊`

#15


我是用crystalreport报表或者直接调用打印机通用的ESC/P指令集来进行打印。

#16


gz

#17


系统不一样不呵`

#18


打印内容也是随着页面比例放大的. 有什么解决办法吗?

如果一定要这样做的话,要在字体与打印的宽度与高度中找一个平衡点
通过改变字体来调整页面比例

#19


问题还是没有得到解决

#20


我也碰到过,我也没有解决,我最后只好不用Printer 来打印,直接向串口或者并口发数据,打印的效果相当漂亮,以前用Printer打印出来模糊不清,现在清清楚楚,而且速度快好几倍,更大的优点是不要安装驱动。

#1


两台电脑的操作系统不一样吧:
肯定一太win9X,另一台是win2000或XP
基于NT核心的打印直接用pinter设置是无效的

#2


to microtry(土炮) :
一台是XP,一台是2000

#3


效果到底差别在什么地方?

#4


操作系统不一样是有时有差别。

#5


按比例放大,一个台电脑大,一台电脑小。

#6


我仔细看了一下
你的代码好像没有显式的说明坐标尺度的计量单位
你所有的尺寸设置就可能代有不确定性(不是绝对值如:厘米或缇),
例如:如果尺寸的参照系是显示象素,那么换一台
电脑的话,就会大小不一了

#7


to microtry(土炮) :
试过,设为匙或毫米都试过。

#8


/关注/

#9


/关注/

#10


Printer.ScaleMode = vbMillimeters '设置座标模式为毫米
Printer.PaperSize = vbPRPSA3 '设置纸张大小
Printer.Orientation = vbPRORPortrait '设置打印方向为纸向

设置纸张宽度或者高度的时候,不要使用ScaleWidth或者ScaleHeight,其与WIDTH和HEIGHT的具体区别请见MSDN。

我用PRINTER做过在98、2000及XP下的打印,打印位置可能会有一些细微的误差,但不会出现你说的整体放大或者缩小,出现你说的这种情况,具我估计就是你用ScaleWidth或者ScaleHeight设置的宽度和高度的比例造成的。

你可以写个简单的程序测试一下,比如只画几条线,再打几个字,只用WIDTH/HEIGHT设置纸张的大小,用Printer.ScaleMode = vbMillimeters 设置座标模式为毫米,测试一下。其他的设置先不用。

#11


如果使用不带参数的 Scale(两组坐标都省略),坐标系统将重置为缇。

 (ScaleWidth) 或 (ScaleHeight)用来描述坐标 度量单位

为了定义基于标准度量单位的比例尺,例如缇、像素、毫米或厘米
应使用 ScaleMode 属性。

把其它任何 Scale 属性设置为任何值都将使 ScaleMode 自动地设置为 0。
ScaleMode 等于 0 是用户定义。


把 ScaleMode 设置为一个大于 0 的数,
将使 ScaleHeight 和 ScaleWidth 的度量单位发生改变,
并将 ScaleLeft 和 ScaleTop 设置为 0。
另外,CurrentX 和 CurrentY 的设置值将发生改变以反映当前点的新坐标。 

以上帮助希望对楼主有用
同意楼上的思路,虽然你设置了绝对尺寸
可是你不能确定你的语句真的会产生你预期的效果
你要先测试一下

#12


关注

#13


删除打印机重装后,两台电脑效果都一样. 也就是说没办法在程序里面设置,使得在不同的打印机上效果一致.

打印内容也是随着页面比例放大的. 有什么解决办法吗?

#14


是不是系统不一样啊`

#15


我是用crystalreport报表或者直接调用打印机通用的ESC/P指令集来进行打印。

#16


gz

#17


系统不一样不呵`

#18


打印内容也是随着页面比例放大的. 有什么解决办法吗?

如果一定要这样做的话,要在字体与打印的宽度与高度中找一个平衡点
通过改变字体来调整页面比例

#19


问题还是没有得到解决

#20


我也碰到过,我也没有解决,我最后只好不用Printer 来打印,直接向串口或者并口发数据,打印的效果相当漂亮,以前用Printer打印出来模糊不清,现在清清楚楚,而且速度快好几倍,更大的优点是不要安装驱动。

#21