该问题我曾经花了很长时间才搞定,当时也到这里问过,实际上以前的代码中的一个错误,是由于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
跟贴有分
就是说如果打印机能打A4,B4,A3的话,就把它们列出来。如果不能打B4的话就
不列出来。
'参数说明:
'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
以上GetLimExtent、GetCurPaper的两个函数是我自己的另外两个功能块,与此无关。
以上mb_CurDM是另外一个模块级变量,就是通过API函数DeviceCapabilities或GetPrinter得到。请参看MSDN
以上GetLimExtent、GetCurPaper的两个函数是我自己的另外两个功能块,与此无关。
以上mb_CurDM是另外一个模块级变量,就是通过API函数DeviceCapabilities(不好意思,写错了,应该是DocumentProperties)或GetPrinter得到。请参看MSDN
你的那2个模块很好用 我想结合这个模块使用 就是将papersize和papername对应起来