当前位置:编程学习 > VB >>

送分400分:请问如何在打印预览前由程序选定自定义纸张

本帖最后由 beijingshengnu 于 2011-01-06 07:14:47 编辑 使用CommanDialog.ShowPrinter,会打开一个打印对话框,里面可以设置页面等属性。  Set DataReport3.DataSource = Adodc1.Recordset
 DataReport3.Sections("section1").Controls("labdanweiming").Caption = strCompany
 If prnshow Then DataReport3.Show 1 Else DataReport3.PrintReport True
 If autoexit Then
    Unload Me
 End If

请帮我看一下,Veron_04,您所说的代码应加在何处,如何把CommanDialog.ShowPrinter 接收到的信息传给DATAREPORT3.

谢谢。 调用printer对象设置纸张规格。在公共模块里加入这个,然后调用。注意红色部分
Option   Explicit

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)

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   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,   pDevModeOutput   As   _
        Any,   _
        pDevModeInput   As   Any,   _
        ByVal   fMode   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   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
引用 3 楼 qiuhui00 的回复:
调用printer对象设置纸张规格。在公共模块里加入这个,然后调用。注意红色部分
Option Explicit

Public Enum PrinterOrientationConstants
  OrientPortrait = 1
  OrientLandscape = 2
End Enum

Private Type DEVMODE
  dmDeviceName As S……


怎么到底粘贴的都是这段代码,一字不差。

请详细注解一下以下这些代码,每一句都请注释一下,各函数的各个参数请详细注解,在哪儿调用自定义纸张类型:

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

昨天泰山不是放过代码吗? 参看
引用 6 楼 ybh37 的回复:
参看


没有详细的注解,谁看得明白呀。大哥。
引用 7 楼 beijingshengnu 的回复:
引用 6 楼 ybh37 的回复:
参看


没有详细的注解,谁看得明白呀。大哥。

这样啊。其实里面最难的是一些API ,这个就不要注释了,还是你自己具体查一下是什么意思更好。
至于那个结构体,最好还是有人给注释一下~ 中国的程序员,在编程的时候,就好像是在操作一个有几千个控制按钮的机器,而这些个按钮还只有其中一小部分,我们知道是什么作用,更不要说了解这个机器的原理了,真是悲哀。
补充:VB ,  网络编程
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,