打印总是默认A4纸,papersize属性不可改,请各位高手帮忙

解决方案 »

  1.   

    printer.height和width 自己设置值后,papersize的确变值了
    但打印还是无法打成航天信息纸张
    之前一直都是好的,莫名其妙,是不是vb设计环境的原因?
      

  2.   

    可以在vb代碼中來更改。參考如下
    設置打印機紙張及打印方向'模組1
    Public Enum PrinterOrientationConstants
      OrientPortrait = 1
      OrientLandscape = 2
    End Enum
        
    Private Type DEVMODE
      dmDeviceName       As String * 32
      dmSpecVersion      As Integer
      dmDriverVersion    As Integer
      dmSize             As Integer
      dmDriverExtra      As Integer
      dmFields           As Long
      dmOrientation      As Integer
      dmPaperSize        As Integer
      dmPaperLength      As Integer
      dmPaperWidth       As Integer
      dmScale            As Integer
      dmCopies           As Integer
      dmDefaultSource    As Integer
      dmPrintQuality     As Integer
      dmColor            As Integer
      dmDuplex           As Integer
      dmYResolution      As Integer
      dmTTOption         As Integer
      dmCollate          As Integer
      dmFormName         As String * 32
      dmUnusedPadding    As Integer
      dmBitsPerPel       As Integer
      dmPelsWidth        As Long
      dmPelsHeight       As Long
      dmDisplayFlags     As Long
      dmDisplayFrequency As Long
    End Type
        
    Private Type PRINTER_DEFAULTS
      pDataType     As String
      pDevMode      As Long
      DesiredAccess As Long
    End Type
        
    Private Type PRINTER_INFO_2
      pServerName         As Long
      pPrinterName        As Long
      pShareName          As Long
      pPortName           As Long
      pDriverName         As Long
      pComment            As Long
      pLocation           As Long
      pDevMode            As Long
      pSepFile            As Long
      pPrintProcessor     As Long
      pDataType           As Long
      pParameters         As Long
      pSecurityDescriptor As Long
      Attributes          As Long
      Priority            As Long
      DefaultPriority     As Long
      StartTime           As Long
      UntilTime           As Long
      Status              As Long
      cJobs               As Long
      AveragePPM          As Long
    End Type
        
    '************************'
    '   iDmpaper值       紙張
    '   11               A5
    '   13               B5
    '************************'
        
    Private Const DM_IN_BUFFER   As Long = 8
    Private Const DM_OUT_BUFFER  As Long = 2
    Private Const DM_ORIENTATION As Long = &H1
    Private Const DM_PAPERSIZE = &H2&
        
    Private Const PRINTER_ACCESS_ADMINISTER As Long = &H4
    Private Const PRINTER_ACCESS_USE        As Long = &H8
    Private Const STANDARD_RIGHTS_REQUIRED  As Long = &HF0000
    Private Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED _
                  Or _
                  PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)
        
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
            (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
        
    Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" _
            (ByVal pPrinterName As String, phPrinter As Long, pDefault As Any) As Long
        
    Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
        
    Declare Function DocumentProperties Lib "winspool.drv" Alias "DocumentPropertiesA" _
            (ByVal hWnd As Long, ByVal hPrinter As Long, ByVal pDeviceName As String, _
            pDevModeOutput As Any, pDevModeInput As Any, ByVal fMode As Long) As Long
        
    Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" _
            (ByVal hPrinter As Long, ByVal level As Long, _
             pPrinter As Any, ByVal cbBuf As Long, pcbNeeded As Long) As Long
        
    Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" _
            (ByVal hPrinter As Long, ByVal level As Long, _
            pPrinter As Any, ByVal Command As Long) As Long
        
    '在打印或預覽之前直接調用SetDefaultPrinterOrientation 打印走向常數。
    Function SetDefaultPrinterOrientation(ByVal eOrientation As _
      PrinterOrientationConstants, iDmpaper As Integer) As Boolean
      Dim bDevMode()      As Byte
      Dim bPrinterInfo2() As Byte
      Dim hPrinter        As Long
      Dim lResult         As Long
      Dim nSize           As Long
      Dim sPrnName        As String
      Dim dm              As DEVMODE
      Dim olddm           As DEVMODE
      Dim pd              As PRINTER_DEFAULTS
      Dim pi2             As PRINTER_INFO_2
        
      '獲取默認打印机的設備名稱
      sPrnName = Printer.DeviceName
      '由于要調用SetPrinter,所以
      '如果是在NT下就要求PRINTER_ALL_ACCESS
      pd.DesiredAccess = PRINTER_ALL_ACCESS
        
      '獲取打印机句柄
      If OpenPrinter(sPrnName, hPrinter, pd) Then
         '獲取PRINTER_INFO_2結构要求的字節數
         Call GetPrinter(hPrinter, 2&, 0&, 0&, nSize)
         ReDim bPrinterInfo2(1 To nSize) As Byte
         lResult = GetPrinter(hPrinter, 2, bPrinterInfo2(1), nSize, nSize)
         Call CopyMemory(pi2, bPrinterInfo2(1), Len(pi2))
         nSize = DocumentProperties(0&, hPrinter, sPrnName, 0&, 0&, 0)
         ReDim bDevMode(1 To nSize)
         If pi2.pDevMode Then
            Call CopyMemory(bDevMode(1), ByVal pi2.pDevMode, Len(dm))
         Else
            Call DocumentProperties(0&, hPrinter, sPrnName, bDevMode(1), 0&, DM_OUT_BUFFER)
         End If
         Call CopyMemory(dm, bDevMode(1), Len(dm))
         Call CopyMemory(olddm, bDevMode(1), Len(olddm))
         With dm
              '設置新的走向
              .dmOrientation = eOrientation
              .dmFields = DM_ORIENTATION
              .dmPaperSize = iDmpaper   '將紙張大小設為iDmpaper,請自行更改所需大小
              '.dmPaperLength = iDmpaperLength
              '.dmPaperWidth = iDmpaperWidth
              .dmFields = DM_PAPERSIZE   '必須,否則無法設置紙張大小
         End With
        
         Call CopyMemory(bDevMode(1), dm, Len(dm))
         Call DocumentProperties(0&, hPrinter, sPrnName, _
         bDevMode(1), bDevMode(1), DM_IN_BUFFER Or _
         DM_OUT_BUFFER)
         pi2.pDevMode = VarPtr(bDevMode(1))
         lResult = SetPrinter(hPrinter, 2, pi2, 0&)
         Call ClosePrinter(hPrinter)
         SetDefaultPrinterOrientation = True
      Else
         SetDefaultPrinterOrientation = False
      End If
    End Function'模組2
    Private Const DM_DUPLEX = &H1000&
    Private Const DMDUP_SIMPLEX = 1
    Private PageDirection     As Integer
        
    Private Sub SetOrientation(NewSetting As Long, chng As Integer, ByVal frm As Form)
      Dim PrinterHandle As Long
      Dim PrinterName   As String
      Dim pd            As PRINTER_DEFAULTS
      Dim MyDevMode     As DEVMODE
      Dim Result        As Long
      Dim Needed        As Long
      Dim pFullDevMode  As Long
      Dim pi2_buffer()  As Long
      PrinterName = Printer.DeviceName
      
      If PrinterName = "" Then Exit Sub
      pd.pDataType = vbNullString
      pd.pDevMode = 0&
      'Printer_Access_All   is   required   for   NT   security
      pd.DesiredAccess = PRINTER_ALL_ACCESS
      Result = OpenPrinter(PrinterName, PrinterHandle, pd)
        
      Result = GetPrinter(PrinterHandle, 2, ByVal 0&, 0, Needed)
      ReDim pi2_buffer((Needed \ 4))
      Result = GetPrinter(PrinterHandle, 2, pi2_buffer(0), Needed, Needed)
      pFullDevMode = pi2_buffer(7)
      Call CopyMemory(MyDevMode, ByVal pFullDevMode, Len(MyDevMode))
      MyDevMode.dmDuplex = NewSetting
      MyDevMode.dmFields = DM_DUPLEX Or DM_ORIENTATION
      MyDevMode.dmOrientation = chng
      Call CopyMemory(ByVal pFullDevMode, MyDevMode, Len(MyDevMode))
      Result = DocumentProperties(frm.hWnd, PrinterHandle, PrinterName, ByVal pFullDevMode, ByVal pFullDevMode, DM_IN_BUFFER Or DM_OUT_BUFFER)
      Result = SetPrinter(PrinterHandle, 2, pi2_buffer(0), 0&)
      Call ClosePrinter(PrinterHandle)
      Dim p As Printer
      For Each p In Printers
          If p.DeviceName = PrinterName Then
             Set Printer = p
             Exit For
          End If
      Next p
      Printer.Duplex = MyDevMode.dmDuplex
    End Sub
        
    Public Sub ChngPrinterOrientationLandscape(ByVal frm As Form)
      PageDirection = 2
      Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
    End Sub
       
    Public Sub ChngPrinterOrientationPortrait(ByVal frm As Form)
      PageDirection = 1
      Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
    End Sub
        
        
    '在屏幕中調用如下
    ChngPrinterOrientationPortrait  Me    '設置為縱向
    ChngPrinterOrientationLandscape Me    '設置為橫向
    SetDefaultPrinterOrientation   2,   9   ‘9為紙張代號