在2000/xp中。VB内的Printer.Height属性就不能设置了。
那么该如何设置当前打印纸张高度呢?

解决方案 »

  1.   

    可以设置Printer对象的PaperSize属性,相关常量参见msdn。
    或者设置ScaleHeigth属性:
        Printer.ScaleMode = vbMillimeters '以毫米为单位
        Printer.ScaleHeight = 297
        Printer.ScaleWidth = 210
      

  2.   

    kissoflife 不是吧!!~
        Printer.ScaleMode = vbMillimeters '以毫米为单位
        Printer.ScaleHeight = 297
        Printer.ScaleWidth = 210
    这三个属性是内部的度量单位!,跟纸张高度有何关系???深深晕倒中俺之所以来API版,是因为这个问题只有API才能解决。
      

  3.   

    '*Constants used in the DevMode structure
    Private Const CCHDEVICENAME = 32
    Private Const CCHFORMNAME = 32'*Constants for NT security
    Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Private Const PRINTER_ACCESS_ADMINISTER = &H4
    Private Const PRINTER_ACCESS_USE = &H8
    Private Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)'*Constants used to make changes to the values contained in the DevMode
    Private Const DM_MODIFY = 8
    Private Const DM_COPY = 2
    Private Const DM_DUPLEX = &H1000&
    Private Const DMDUP_SIMPLEX = 1
    Private Const DMDUP_VERTICAL = 2
    Private Const DMDUP_HORIZONTAL = 3Private 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 DM_PAPERWIDTH = &H8&
    Private Const DM_PAPERLENGTH = &H4&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 TypePrivate Type PRINTER_DEFAULTS
        pDataType           As String
        pDevMode            As Long
        DesiredAccess       As Long
    End TypePrivate 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'*------DECLARATIONS
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
            (hpvDest As Any, hpvSource As Any, _
            ByVal cbCopy As Long)Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" _
            (ByVal pPrinterName As String, _
            phPrinter As Long, pDefault As Any) As LongPrivate Declare Function ClosePrinter Lib "winspool.drv" _
            (ByVal hPrinter As Long) As LongPrivate 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 LongPrivate 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 LongPrivate Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" _
            (ByVal hPrinter As Long, ByVal level As Long, _
            pPrinter As Any, ByVal Command As Long) As LongPrivate Sub Command1_Click()
    Dim uu As Boolean
    If Printer.PaperSize <> 9 Then
        uu = mySetPrinter(Printer.DeviceName, 1, 9, 0, 0)
        Printer.EndDoc
    End If
    End SubPublic Function mySetPrinter(prnName As String, Optional eOrientation As Integer, Optional iDmpaper As Integer, Optional iDmpaperLength As Single, Optional iDmpaperWidth As Single) As BooleanDim bDevMode()          As Byte
    Dim bPrinterInfo2()     As Byte
    Dim hPrinter            As Long
    Dim lResult             As Long
    Dim nSize               As Long
    Dim sPrnName            As StringDim dm          As DEVMODE
    Dim olddm       As DEVMODE
    Dim pd          As PRINTER_DEFAULTS
    Dim pi2         As PRINTER_INFO_2    On Error GoTo err_proc
        
        sPrnName = prnName
        pd.DesiredAccess = PRINTER_ALL_ACCESS
        
        If OpenPrinter(sPrnName, hPrinter, pd) Then
        
        
            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
                If eOrientation <> 0 Then
                    .dmOrientation = eOrientation
                    .dmFields = DM_ORIENTATION
                End If
                If iDmpaper <> 0 And iDmpaper <> vbPRPSUser Then
                    .dmPaperSize = iDmpaper
                    .dmFields = DM_PAPERSIZE
                End If
                If iDmpaper = vbPRPSUser Then
                    .dmFields = DM_PAPERLENGTH Or DM_PAPERWIDTH
                    .dmPaperLength = iDmpaperLength
                    .dmPaperWidth = iDmpaperWidth
                End If
            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)
            mySetPrinter = True
        Else
            mySetPrinter = False
        End If
        
        Exit Function
        
    err_proc:
        mySetPrinter = False
    End Function在2000下我也遇到过,不过是常规纸张的设置,至于自定义你可以试试,eOrientation是方向,iDmpaper = vbPRPSUser为自定义, iDmpaperLength和iDmpaperWidth 是长和宽
      

  4.   

    在NT操作系统下,需要使用自定义纸张来控制纸张的大小,printer对象是无效的.