在VB中,我用CommonDialog.showprinter后调出打印对话框用来设置打印,比如把默认的A4纸型设成A5纸型,但打印出来的还是A4的,请问各位大侠这是怎么回事,是不是还要对CommonDialog的某些属性进行设置?
万望指教!!

解决方案 »

  1.   

    在win98中可以直接改就可以了
    在win2000以上直接改是不行的,只能到打印机设置里去改默认选项才行。
      

  2.   

    VB是这么烂的.打的纸张取决于打印机默认设置的纸型.用代码改的根本无效,除非你是水晶报表就可以啊,用DATAREPORT都不行.
      

  3.   

    那就意味着我没办法用CommonDialog的打印对话框来改变打印设置了吗?
    有没有哪位大侠有解决的方法?
      

  4.   

    Printer.PaperSize = 9
    If Printer.PaperSize <> 9 Then             '如果无法改变则调用mySetPrinter
        uu = mySetPrinter(Printer.DeviceName, 1, 9, 0, 0)
        Printer.EndDoc
    End If
    Public 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
        '*由于要调用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
                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相关API声明未列