打印函数如下:
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 SubhaveErr:
  isPrint = False
  WP = False
End Sub上面打函数打印,同样的代码、同一台打印机、不同的电脑打印效果居然不一样。好像是会继承打印机的某项默认设置来打印,我尝试修改了不少Printer属性没有反应。有人能指点一下么?

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

    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 设置座标模式为毫米,测试一下。其他的设置先不用。
      

  5.   

    如果使用不带参数的 Scale(两组坐标都省略),坐标系统将重置为缇。 (ScaleWidth) 或 (ScaleHeight)用来描述坐标 度量单位为了定义基于标准度量单位的比例尺,例如缇、像素、毫米或厘米
    应使用 ScaleMode 属性。把其它任何 Scale 属性设置为任何值都将使 ScaleMode 自动地设置为 0。
    ScaleMode 等于 0 是用户定义。
    把 ScaleMode 设置为一个大于 0 的数,
    将使 ScaleHeight 和 ScaleWidth 的度量单位发生改变,
    并将 ScaleLeft 和 ScaleTop 设置为 0。
    另外,CurrentX 和 CurrentY 的设置值将发生改变以反映当前点的新坐标。 以上帮助希望对楼主有用
    同意楼上的思路,虽然你设置了绝对尺寸
    可是你不能确定你的语句真的会产生你预期的效果
    你要先测试一下
      

  6.   

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

  7.   

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