win2000中如何得到当前打印机所支持的纸张类型列表,及其对应的PaperSize值?

mylzw 2003-11-30 07:10:20
如题
...全文
313 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mylzw 2003-12-01
  • 打赏
  • 举报
回复
northwolves(野性的呼唤) 的方法不错! 学习。
不过为何 DeviceCapabilities 这个API在API浏览器中找不到?~
mylzw 2003-12-01
  • 打赏
  • 举报
回复
to rainstormmaster 你说的那个地方的玩意我试了,返回的纸张类型列表很多多不适用于
当前打印机啊。
mylzw 2003-12-01
  • 打赏
  • 举报
回复
thank all~
rainstormmaster 2003-12-01
  • 打赏
  • 举报
回复
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=1
rainstormmaster 2003-12-01
  • 打赏
  • 举报
回复
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 Boolean

Dim i As Long, ret As Long
Dim Length As Integer, Width As Integer
Dim PaperNo() As Integer, PaperName() As String, PaperSize() As POINTS

With 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 i

End Function



rainstormmaster 2003-12-01
  • 打赏
  • 举报
回复
你用的是2000,当然找不到了,DeviceCapabilities仅适用于Win9x:

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 返回设备驱动程序的规格版本号


rainstormmaster 2003-11-30
  • 打赏
  • 举报
回复
参考:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;282474
HOWTO: Print Using Custom Page Sizes on Windows NT and Windows 2000

不仅可以满足你的要求,还介绍了如何使用自定义纸张
northwolves 2003-11-30
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2435/2435771.xml?temp=.7588007

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧