http://www.csdn.net/expert/topic/409/409336.shtm

解决方案 »

  1.   

    http://www.csdn.net/expert/topic/409/409336.shtm
    跟贴有分
      

  2.   

    我的意思是有没有什么方法把一个打印机可以打印的所有的纸张大小给列出来。
    就是说如果打印机能打A4,B4,A3的话,就把它们列出来。如果不能打B4的话就
    不列出来。
      

  3.   

    该问题我曾经花了很长时间才搞定,当时也到这里问过,实际上以前的代码中的一个错误,是由于MSDN的说明有误,所以才造成有时候列出来的纸张规格不正确。下面的代码是成功的代码。至于其中所用的一些数据结构与API函数,自己留给你自己去完成吧。Private Sub FillPapers(sName As String, sPort As String)
    '参数说明:
    'sName------打印机名称Printer.DeviceName
    'sPort------打印机端口Printer.Port
        On Error Resume Next
        Dim PaperCount As Long
        Dim PaperSize As Integer
        Dim bytePaperNames() As Byte
        Dim bytePaperSizes() As Byte
        Dim sInfo As String
        Dim i As Long
        
        Dim hPrn As Long
        Dim PrnDef As PRINTER_DEFAULTS
        Dim lbNeed As Long
        Dim dm As DEVMODE
        Dim bDM() As Byte
        Dim lResult As Long
        
        Screen.MousePointer = vbHourglass
        PrnDef.DesiredAccess = PRINTER_ALL_ACCESS
        lResult = OpenPrinter(sName, hPrn, PrnDef)
    '    CopyMemory dm, mb_CurDM(1), Len(dm)
        lbNeed = DocumentProperties(Me.hwnd, hPrn, sName, dm, dm, 0&)
        ReDim bDM(1 To lbNeed)
        CopyMemory bDM(1), mb_CurDM(1), lbNeed
        
        PaperCount = DeviceCapabilities(sName, sPort, DC_PAPERNAMES, 0&, bDM(1))
        If PaperCount <= 0 Then
             cboPrinter(1).Clear
             MsgBox "打印机" & sName & "无有效的打印纸张规格!请检查是否正确安装了该打印机.", vbInformation, VCSPRINTTITLE
             Screen.MousePointer = vbDefault
             Exit Sub
        End If
        Dim l As Long
        ReDim bytePaperNames(1 To 64 * PaperCount)
        Call DeviceCapabilities(sName, sPort, DC_PAPERNAMES, VarPtr(bytePaperNames(1)), bDM(1))    ReDim bytePaperSizes(1 To 2 * PaperCount)
        Call DeviceCapabilities(sName, sPort, DC_PAPERS, VarPtr(bytePaperSizes(1)), bDM(1))
        
        cboPrinter(1).Clear
        For i = 1 To PaperCount
            sInfo = StrConv(MidB(bytePaperNames, (i - 1) * 64 + 1, 64), vbUnicode)
            cboPrinter(1).AddItem Left(sInfo, InStr(sInfo, Chr(0)) - 1)  '纸张名称
            CopyMemory PaperSize, bytePaperSizes((i - 1) * 2 + 1), 2
            cboPrinter(1).ItemData(cboPrinter(1).NewIndex) = PaperSize
            DoEvents
        Next i
        
        Call GetLimExtent(sName, sPort, m_MinWidth, m_MaxWidth, m_MinHeight, m_MaxHeight)
        Call GetCurPaper(PaperCount)
        
        Screen.MousePointer = vbDefault
        
    End Sub
      

  4.   

    说明:
    以上GetLimExtent、GetCurPaper的两个函数是我自己的另外两个功能块,与此无关。
    以上mb_CurDM是另外一个模块级变量,就是通过API函数DeviceCapabilities或GetPrinter得到。请参看MSDN
      

  5.   

    更正说明:
    以上GetLimExtent、GetCurPaper的两个函数是我自己的另外两个功能块,与此无关。
    以上mb_CurDM是另外一个模块级变量,就是通过API函数DeviceCapabilities(不好意思,写错了,应该是DocumentProperties)或GetPrinter得到。请参看MSDN 
      

  6.   

    qingfengljh(清风)  请说详细点 分不成问题 来30分吧
    你的那2个模块很好用 我想结合这个模块使用 就是将papersize和papername对应起来
      

  7.   

    http://www.csdn.net/Expert/topic/492/492644.shtm来这里说啊 我才好给你分数
      

  8.   

    去 看看:http://www.merrioncomputing.com/Programming/PrintStatus.htm