在2000下如何通过代码改变自定义纸张的打印方向?

解决方案 »

  1.   

    printer对象Orientation 属性
          返回或设置一个值,该值指出文档是以纵向还是横向的方式被打印。在设计时是不可用的。语法object.Orientation [= value]Orientation 属性的语法包含下面部分:部分 描述 
    Object 对象表达式,其值是“应用于”列表中的一个对象。 
    Value 一个决定页方向的值或常数,“设置值”中有详细描述。 
    设置值value 的设置值为:常数 值 描述 
    VbPRORPortrait 1 文档打印以纸的窄边作顶部。 VbPRORLandscape 2 文档打印以纸的宽边作顶部。 
      

  2.   

    我通过API函数让其变为自定义而且付给了尺寸,但当我通过printer.Orientation =2改为纵向打印时纸张却还打印出横向内容?
      

  3.   

    http://expert.csdn.net/Expert/topic/2227/2227306.xml?temp=.7761957
    参考:
    '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_IN_BUFFER = DM_MODIFY
    Private Const DM_COPY = 2
    Private Const DM_OUT_BUFFER = DM_COPY
    Private Const DM_DUPLEX = &H1000&
    Private Const DMDUP_SIMPLEX = 1
    Private Const DMDUP_VERTICAL = 2
    Private Const DMDUP_HORIZONTAL = 3
    Private Const DM_ORIENTATION = &H1&
    Private PageDirection As Integer
    Private myPapersize As IntegerPrivate Type DEVMODE
       dmDeviceName As String * CCHDEVICENAME
       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 * CCHFORMNAME
       dmLogPixels As Integer
       dmBitsPerPel As Long
       dmPelsWidth As Long
       dmPelsHeight As Long
       dmDisplayFlags As Long
       dmDisplayFrequency As Long
       dmICMMethod As Long        ' // Windows 95 only
       dmICMIntent As Long        ' // Windows 95 only
       dmMediaType As Long        ' // Windows 95 only
       dmDitherType As Long       ' // Windows 95 only
       dmReserved1 As Long        ' // Windows 95 only
       dmReserved2 As Long        ' // Windows 95 only
    End TypePrivate Type PRINTER_DEFAULTS
    'Note:
    '  The definition of Printer_Defaults in the VB5 API viewer is incorrect.
    '  Below, pDevMode has been corrected to LONG.
       pDatatype As String
       pDevMode As Long
       DesiredAccess As Long
    End Type
    '------DECLARATIONSPrivate Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
    Private 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
    Private 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
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
    Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
    Private Declare Function DocumentProperties Lib "winspool.drv" Alias "DocumentPropertiesA" (ByVal hwnd As Long, ByVal hPrinter As Long, ByVal pDeviceName As String, ByVal pDevModeOutput As Any, ByVal pDevModeInput As Any, ByVal fMode As Long) As LongPrivate 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     'This is a block of memory for the Printer_Info_2 structure
           'If you need to use the Printer_Info_2 User Defined Type, the
           '  definition of Printer_Info_2 in the API viewer is incorrect.
           '  pDevMode and pSecurityDescriptor should be defined As Long.
       
       PrinterName = Printer.DeviceName
       If PrinterName = "" Then
           Exit Sub
       End If
       
       pd.pDatatype = vbNullString
       pd.pDevMode = 0&
       'Printer_Access_All is required for NT security
       pd.DesiredAccess = PRINTER_ALL_ACCESS
       
       Result = OpenPrinter(PrinterName, PrinterHandle, pd)
       
       'The first call to GetPrinter gets the size, in bytes, of the buffer needed.
       'This value is divided by 4 since each element of pi2_buffer is a long.
       Result = GetPrinter(PrinterHandle, 2, ByVal 0&, 0, Needed)
       ReDim pi2_buffer((Needed \ 4))
       Result = GetPrinter(PrinterHandle, 2, pi2_buffer(0), Needed, Needed)
       
       'The seventh element of pi2_buffer is a Pointer to a block of memory
       '  which contains the full DevMode (including the PRIVATE portion).
       pFullDevMode = pi2_buffer(7)
       
       'Copy the Public portion of FullDevMode into our DevMode structure
       Call CopyMemory(MyDevMode, ByVal pFullDevMode, Len(MyDevMode))
       
       'Make desired changes
       MyDevMode.dmDuplex = NewSetting
       MyDevMode.dmFields = DM_DUPLEX Or DM_ORIENTATION
       MyDevMode.dmOrientation = chng
       
       'Copy our DevMode structure back into FullDevMode
       Call CopyMemory(ByVal pFullDevMode, MyDevMode, Len(MyDevMode))
       
       'Copy our changes to "the PUBLIC portion of the DevMode" into "the PRIVATE portion of the DevMode"
       Result = DocumentProperties(frm.hwnd, PrinterHandle, PrinterName, ByVal pFullDevMode, ByVal pFullDevMode, DM_IN_BUFFER Or DM_OUT_BUFFER)
       
       'Update the printer's default properties (to verify, go to the Printer folder
       '  and check the properties for the printer)
       Result = SetPrinter(PrinterHandle, 2, pi2_buffer(0), 0&)
       
       Call ClosePrinter(PrinterHandle)
       
       'Note: Once "Set Printer = " is executed, anywhere in the code, after that point
       '      changes made with SetPrinter will ONLY affect the system-wide printer  --
       '      -- the changes will NOT affect the VB printer object.
       '      Therefore, it may be necessary to reset the printer object's parameters to
       '      those chosen in the devmode.
       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
      

  4.   

    Public Sub ChngPrinterOrientationLandscape(ByVal frm As Form)
       PageDirection = 2
       Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
    End SubPublic Sub ResetPrinterOrientation(ByVal frm As Form)   If PageDirection = 1 Then
           PageDirection = 2
       Else
           PageDirection = 1
       End If
       Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
    End SubPublic Sub ChngPrinterOrientationPortrait(ByVal frm As Form)   PageDirection = 1
       Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
    End Sub
    Public Sub ResetPrinterPaperSize(ByVal frm As Form)   If myPapersize = 1 Then
           myPapersize = 2
       Else
           myPapersize = 1
       End If
       Call SetPapersize(DMDUP_SIMPLEX, myPapersize, frm)
    End Sub
    Public Sub ChngPrinterPaperSizeLetter(ByVal frm As Form)   myPapersize = 1
       Call SetPapersize(DMDUP_SIMPLEX, myPapersize, frm)
    End Sub
    Public Sub ChngPrinterPaperSizeLedger(ByVal frm As Form)   myPapersize = 3
       Call SetPapersize(DMDUP_SIMPLEX, myPapersize, frm)
    End Sub
    Private Sub SetPapersize(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     'This is a block of memory for the Printer_Info_2 structure
           'If you need to use the Printer_Info_2 User Defined Type, the
           '  definition of Printer_Info_2 in the API viewer is incorrect.
           '  pDevMode and pSecurityDescriptor should be defined As Long.
       
       PrinterName = Printer.DeviceName
       If PrinterName = "" Then
           Exit Sub
       End If
       
       pd.pDatatype = vbNullString
       pd.pDevMode = 0&
       'Printer_Access_All is required for NT security
       pd.DesiredAccess = PRINTER_ALL_ACCESS
       
       Result = OpenPrinter(PrinterName, PrinterHandle, pd)
       
       'The first call to GetPrinter gets the size, in bytes, of the buffer needed.
       'This value is divided by 4 since each element of pi2_buffer is a long.
       Result = GetPrinter(PrinterHandle, 2, ByVal 0&, 0, Needed)
       ReDim pi2_buffer((Needed \ 4))
       Result = GetPrinter(PrinterHandle, 2, pi2_buffer(0), Needed, Needed)
       
       'The seventh element of pi2_buffer is a Pointer to a block of memory
       '  which contains the full DevMode (including the PRIVATE portion).
       pFullDevMode = pi2_buffer(7)
       
       'Copy the Public portion of FullDevMode into our DevMode structure
       Call CopyMemory(MyDevMode, ByVal pFullDevMode, Len(MyDevMode))
       
       'Make desired changes
       MyDevMode.dmDuplex = NewSetting
       MyDevMode.dmFields = DM_DUPLEX Or DM_ORIENTATION
       MyDevMode.dmPaperSize = chng
       
       'Copy our DevMode structure back into FullDevMode
       Call CopyMemory(ByVal pFullDevMode, MyDevMode, Len(MyDevMode))
       
       'Copy our changes to "the PUBLIC portion of the DevMode" into "the PRIVATE portion of the DevMode"
       Result = DocumentProperties(frm.hwnd, PrinterHandle, PrinterName, ByVal pFullDevMode, ByVal pFullDevMode, DM_IN_BUFFER Or DM_OUT_BUFFER)
       
       'Update the printer's default properties (to verify, go to the Printer folder
       '  and check the properties for the printer)
       Result = SetPrinter(PrinterHandle, 2, pi2_buffer(0), 0&)
       
       Call ClosePrinter(PrinterHandle)
       
       'Note: Once "Set Printer = " is executed, anywhere in the code, after that point
       '      changes made with SetPrinter will ONLY affect the system-wide printer  --
       '      -- the changes will NOT affect the VB printer object.
       '      Therefore, it may be necessary to reset the printer object's parameters to
       '      those chosen in the devmode.
       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