本帖最后由 bcrun 于 2011-01-20 14:47:48 编辑

解决方案 »

  1.   

    也就是说,我加上“Printer.Orientation = vbPRORLandscape”语句后,更改默认打印机,默认打印机变了(我在word文档中可以看到,默认打印机确实更改了),可是,在VB程序中,Printer.DeviceName仍然是原来的打印机名。
      

  2.   

    Printer 对象和 Printers 集合
                使用 Printer 对象可以实现与系统打印机的通讯(最初是缺省系统打印机)。用 Printers 集合可获取有关系统上所有可用打印机的信息。语法PrinterPrinters(index)index 所在处表示从 0 到 Printers.Count-1 之间的整数。说明用图形方法在 Printer 对象上绘制文本和图形。一旦 Printer 对象中含有将要打印的输出信息,可用 EndDoc 方法直接将输出信息送到应用程序的缺省打印机上。如果要打印这些信息,应该检查和可能还要修正窗体的布局。例如,如果用 PrintForm 方法打印窗体,则到页底图形图象可能被剪切,而文本则被移到下一页。Printers 集合可用来查询可用的打印机,这样就可以为应用程序指定一台缺省打印机。例如也许要找出哪些可用打印机用了指定的打印驱动程序。下面的代码查找所有的可用打印机,定位在第一个将页码方向设置为纵向的打印机,然后将其设置为 Portrait。Dim X As Printer
    For Each X In Printers
       If X.Orientation = vbPRORPortrait Then
          '设定为系统缺省打印机。
          Set Printer = X
          ' 终止查找打印机。
          Exit For
       End If
    Next用 Set 语句指定 Printers 集合中的某一打印机为缺省打印机。前面的示例指定由对象变量 X 标识的打印机为应用程序的缺省打印机。注意 如果用 Printers 集合来确定某一特定打印机,如 Printers(3),则只能访问只读属性。如果想访问个别打印机的可读写属性,那么首先要使那个打印机成为应用程序的缺省打印机。
    你的打印_click()使用的是printer(程序启动是的默认打印机对象的引用),在你修改默认打印机之后,你依然用printer对象,就是说你用的是之前的那个默认打印机,不是新的默认打印机,所以出现问题。
    我没有多个打印机,我想你应该在修改默认打印机那里修改printer,加上set printer=...之类的东西------------
    比如下面的代码修改了printer对象,并在不同的打印机上打印同样的一个圆
    Private Sub Command1_Click()
    Dim p As Printer
    For Each p In Printers
        If p.DeviceName = Combo1.Text Then
            Set Printer = p
            Exit Sub
        End If
    Next
    End SubPrivate Sub Command2_Click()
    Label1.Caption = Printer.DeviceName
    End SubPrivate Sub Command3_Click()
        Printer.Circle (0, 0), 1000
        Printer.EndDoc
    End SubPrivate Sub Form_Load()
    Dim p As Printer
    Combo1.Clear
    For Each p In Printers
        Combo1.AddItem p.DeviceName
    Next
    End Sub
      

  3.   

    Printer.Orientation = vbPRORLandscape是改变打印方向,跟设备名称有何关系?