打印机不同好像支持的纸张名称种类也不同,我希望在代码中选择不同的纸张名称,但是怎么得到当前打印机所支持的纸张名称呢?

解决方案 »

  1.   

    看看
    http://expert.csdn.net/Expert/topic/2310/2310827.xml?temp=.2765314
      

  2.   

    这是我原来的一段代码,其中有向combobox中添加纸张名称的代码,你把那几句改一下就行了。Private Type PRINTER_DEFAULTS
            pDatatype As String
            pDevMode As Long
            DesiredAccess As Long
    End Type
    Private Const PRINTER_ACCESS_ADMINISTER = &H4
    Private Const PRINTER_ACCESS_USE = &H8
    Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As LongPrivate Function GetPaperName() As Boolean
        '获得打印机支持的纸张类型
        On Error GoTo Err    Dim lngRet              As Long
        Dim strDeviceName       As String
        Dim objPrint            As Printer
        Dim lngPrint            As Long
        Dim lngCount            As Long
        Dim intType()           As Integer
        Dim strPaperNames       As String
        Dim strPName            As String
        Dim lngPos              As Long
        Dim strTmp              As String
        Dim lngX                As Long
        Dim pd                  As PRINTER_DEFAULTS
        
        pd.DesiredAccess = PRINTER_ACCESS_ADMINISTER
        strDeviceName = Printer.DeviceName
     '   strDeviceName = GetDefaultPrinter
        If strDeviceName = "" Then Exit Function
        For Each objPrint In Printers
            If objPrint.DeviceName = strDeviceName Then
                lngRet = OpenPrinter(objPrint.DeviceName, lngPrint, pd)
                If lngRet <> 0 Then
                    lngCount = DeviceCapabilities(objPrint.DeviceName, objPrint.Port, DC_PAPERS, ByVal vbNullString, 0)
                    ReDim intType(1 To lngCount)
                    strPaperNames = String(lngCount * 64, 0)
                    '获得纸张类型的值,返回值lngCount为纸张类型的数量
                    lngCount = DeviceCapabilities(objPrint.DeviceName, objPrint.Port, DC_PAPERS, intType(1), 0)
                    '获得纸张类型名称
                    lngCount = DeviceCapabilities(objPrint.DeviceName, objPrint.Port, DC_PAPERNAMES, ByVal strPaperNames, 0)
                    For lngX = 1 To lngCount
                        '每个名称的字节长度为64。
                        '如果名称中包含汉字,则每个名称的字节长度小于64,
                        '在获得下一个名称时,需减去累积汉字的个数,才能得到正确的起始位置
                        strPName = Mid(strPaperNames, 64 * (lngX - 1) + 1 - lngPos, 64)
                        strTmp = StrReverse(strPName)
                        lngPos = lngPos + InStr(strTmp, Chr(0)) - 1
                        strPName = Left(strPName, InStr(strPName, Chr(0)) - 1)
                        cboPapers(0).AddItem intType(lngX)
                        cboPapers(1).AddItem strPName
                    Next
                Else
    '                MsgBox Err.LastDllError
                    GetAPIError Err.LastDllError
                End If
                ClosePrinter (lngPrint)
                Exit For
            End If
        Next
        GetPaperName = True
        Exit Function
    Err:
        MsgBox "GetPaperName" & Err.Number & "-" & Err.Description & "-" & Err.Source, vbCritical
    End Function
      

  3.   

    Win2000/NT系统下,纸张的大小由DevMode结构的四个属性决定:   dmPaperSize As Integer   dmPaperLength As Integer   dmPaperWidth As Integer   dmFormName As String * CCHFORMNAME  其中dmFormName用于NT系统中指定打印纸张大小为预定义的某个纸张(Form),但是VB的 printer object不支持FormName属性,您可以通过API函数DocumentProperties修改DevMode结构的dmFormName属性实现自定义打印。具体用法可以参考:
    http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q180/6/45.asp&NoWebContent=1http://www.yesue.com/question/show.asp?id=92&catalog=Q_Program_VBC&back=1
      

  4.   

    如果用的是98,可以使用DeviceCapabilities :DeviceCapabilities VB声明 
    Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, ByVal lpPort As String, ByVal iIndex As Long, ByVal lpOutput As String, lpDevMode As DEVMODE) As Long 
    说明 
    利用这个函数可获得与一个设备的能力有关的信息 
    返回值 
    Long,由iIndex参数的值决定,请参考设备能力常数表。如函数执行失败,或打印机的驱动程序不支持这个函数,那么函数就会返回-1 
    参数表 
    参数 类型及说明 
    lpDeviceName String,设备名 
    lpPort String,指定连接了指定设备的那个端口 
    iIndex Long,欲测试的能力。请参考设备能力常数表,其中列出了可选的值 
    lpOutput String,指定一个缓冲区的地址,能力数据会装载到这个缓冲区中。在设备能力常数表中,针对每个fwCapabilities值的缓冲区的内容都进行了总结。这个表格同时总结了应将参数设为vbNullString的一些情况 
    lpDevMode DEVMODE,一个DEVMODE结构的地址,或者为零。如指定了那个结构,函数会根据这个结构的设置来接收信息。如果为零,函数就会根据打印机驱动程序的默认值接收信息 
    注解 
    使用lpOutput时要注意:在许多时候,这个函数会返回一系列名称的列表。例如,假设将fwCapabilities标志设为DC_PAPERNAMES,那么就会得到一系列支持的纸张尺寸的名字。在这种情况下,lpOutput缓冲区应该是一个String变量,而且根据设备能力常数表的总结预先初始化成合适的长度。函数会在缓冲区中载入所有名称,而且每个名称在字串中都占用固定的空间。所以,我们完全能用Mid函数提取出每一个条目。
    某些情况下,lpOutput需要指向一个数值数组的指针
     设备能力常数表 
    fwCapabilities 说明 
    DC_BINADJUST 返回来自API32.TXT的某个常数。它应带有 DCBA_ 前缀,用于指定当前纸张源的正确纸张方向。仅适用于Win95 
    DC_BINNAMES 如lpOutput为零,就返回由打印机支持的纸匣数量。否则,lpOutput应指向一个缓冲区(长度至少为24×纸匣数)。每24个字节都会保存一个纸匣的NULL中止名称 
    DC_BINS 如lpOutput为零,就返回由打印机支持的纸匣数量。否则,lpOutput应指向一个整数数组(长度至少为纸匣数量)。这些值对应于为DEVMODE结构定义的 DMBIN_??? 常数 
    DC_COPIES 返回打印机能够打印的最大副本数量 
    DC_DATATYPE_PRODUCED 接收由打印机支持的一系列数据类型。这些类型可作为由StartDoc函数使用的DOCINFO结构的输出数据类型提供。如这个函数返回-1,那么支持的唯一数据类型就是 RAW 。仅适用于Win95 
    DC_DRIVER 返回打印机驱动程序的版本号 
    DC_DUPLEX 如打印机有双面打印功能,就返回1;否则返回0 
    DC_EMF_COMPLIANT 如打印机能直接支持增强型图元文件,就返回TRUE。仅适用于Win95 
    DC_ENUMRESOLUTIONS 如lpOutput为零,就返回由打印机支持的分辨率数量。否则,lpOutput应该是一个指向Long型数组的指针。该数组至少应包含(2×分辨率数量)个条目。每对条目都反映出水平和垂直分辨率(以每英寸的点数——dpi——为单位) 
    DC_EXTRA 返回与具体设备有关的特殊字节,它们要为这个设备追加到DEVMODE结构后面 
    DC_FIELDS 针对设备默认的DEVMODE数据结构,返回dmFields字段的值 
    DC_FILEDEPENDENCIES 如lpOutput为零,就返回打印机驱动程序要求的文件数量。否则,lpOutput应指向一个至少有(64×文件数)个字节的缓冲区。每64个字节都会保存一个请求文件的NULL中止名称 
    DC_MAXEXTENT 返回一个Long型值,其中包含打印机支持的最大纸张长度和宽度。其中,低字(16位)包含的是宽度数据。它们是由dmPaperWidth 和 dmPaperLength这两个DEVMODE字段的最大值 
    DC_MINEXTENT 返回一个Long型值,其中包含打印机支持的最小纸张长度和宽度。其中,低字(16位)包含的是宽度数据。它们是由dmPaperWidth 和 dmPaperLength这两个DEVMODE字段的最大值 
    DC_ORIENTATION 返回横向模式和纵向模式间的旋转度数。如果是零,表示驱动程序不支持横向打印模式。对于激光打印机,90度是最常见的一个设置;而对于点阵式打印机,一般都是270度 
    DC_PAPERNAMES 如lpOutput为零,就返回由打印机支持的纸张尺寸数量。否则,lpOutput就应指向一个缓冲区(长度至少为64×纸张尺寸种数)。每64个字节都会装载一种支持的纸张尺寸的空中止名称 
    DC_PAPERS 如lpOutput为零,就返回由打印机支持的纸张尺寸数量。否则,lpOutput就应指向一个整数数组(长度至少为纸张的尺寸种数)。值对应于为DEVMODE结构定义的 DMPAPER_??? 常数 
    DC_SIZE 返回打印机DEVMODE数据结构的dmSize字段 
    DC_TRUETYPE 下述常数之一: 
    DCTT_BITMAP 设备能将TrueType字体当作图形打印 
    DCTT_DOWNLOAD 设备能下载TrueType字体 
    DCTT_OUTLINE 设备能下载轮廓型TrueType字体 
    DCTT_SUBDEV 设备能取代与对应的TrueType字体兼容的内建字体 
    DC_VERSION 返回设备驱动程序的规格版本号 
      

  5.   

    DeviceCapabilities的用法示例:
    如何获取打印机纸张信息?
      办法如下:
    Option Explicit
    Private Const DC_MAXEXTENT = 5
    Private Const DC_MINEXTENT = 4
    Private Const DC_PAPERNAMES = 16
    Private Const DC_PAPERS = 2
    Private Const DC_PAPERSIZE = 3
    Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, lpDevMode As Any) As Long
    Private Type POINTS
    x As Long
    y As Long
    End Type '***********************************************************
    '* 名称:GetPaperInfo
    '* 功能:得到打印机低张信息
    '* 用法:GetPaperInfo(控件名)
    '* 描述:如在 form_load()中调用GetPaperInfo MSHFlexGrid1
    '***********************************************************
    Public Function GetPaperInfo(Flex As MSHFlexGrid) As BooleanDim i As Long, ret As Long
    Dim Length As Integer, Width As Integer
    Dim PaperNo() As Integer, PaperName() As String, PaperSize() As POINTSWith Flex
    .FormatString = "^纸张编号|^纸张名称|^纸张长度|^纸张宽度"
    For i = 0 To .Cols - 1
    .ColWidth(i) = 1700
    Next i
    .AllowUserResizing = flexResizeColumns
    .Left = 0
    End With'支持最大打印纸:
    ret = DeviceCapabilities(Printer.DeviceName, "LPT1", DC_MAXEXTENT, ByVal 0&, ByVal 0&)
    Length = ret \ 65536
    Width = ret - Length * 65536'支持最小打印纸:
    ret = DeviceCapabilities(Printer.DeviceName, "LPT1", DC_MINEXTENT, ByVal 0&, ByVal 0&)
    Length = ret \ 65536
    Width = ret - Length * 65536'支持纸张种类数
    ret = DeviceCapabilities(Printer.DeviceName, "LPT1", DC_PAPERS, ByVal 0&, ByVal 0&)'纸张编号
    ReDim PaperNo(1 To ret) As Integer
    Call DeviceCapabilities(Printer.DeviceName, "LPT1", DC_PAPERS, PaperNo(1), ByVal 0&)'纸张名称
    Dim arrPageName() As Byte
    Dim allNames As String
    Dim lStart As Long, lEnd As Long
    ReDim PaperName(1 To ret) As String
    ReDim arrPageName(1 To ret * 64) As Byte
    Call DeviceCapabilities(Printer.DeviceName, "LPT1", DC_PAPERNAMES, arrPageName(1), ByVal 0&)
    allNames = StrConv(arrPageName, vbUnicode)
    'loop through the string and search for the names of the papers
    i = 1
    Do
    lEnd = InStr(lStart + 1, allNames, Chr$(0), vbBinaryCompare)
    If (lEnd > 0) And (lEnd - lStart - 1 > 0) Then
    PaperName(i) = Mid$(allNames, lStart + 1, lEnd - lStart - 1)
    i = i + 1
    End If
    lStart = lEnd
    Loop Until lEnd = 0'纸张尺寸ReDim PaperSize(1 To ret) As POINTS
    Call DeviceCapabilities(Printer.DeviceName, "LPT1", DC_PAPERSIZE, PaperSize(1), ByVal 0&)'显示在表格中
    For i = 1 To ret
    Flex.AddItem PaperNo(i) & vbTab & PaperName(i)
    & vbTab & PaperSize(i).y & vbTab & PaperSize(i).x
    Next iEnd Function
     
      

  6.   

    哦,我的代码中少了API的声明
    Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, lpDevMode As Any) As Long