Vb6 打印机页面大小问题
我正在尝试通过以下操作设置自定义纸张尺寸:Vb6 打印机页面大小问题,vb6,size,printing,Vb6,Size,Printing,我正在尝试通过以下操作设置自定义纸张尺寸: Printer.Height = 2160 Printer.Width = 11900 但它没有任何效果。设置好后,我请求该值,它返回默认值。这是: Printer.PaperSize = 256 返回一个错误 有什么想法吗?您的打印机不允许设置这些属性,或者您超出了允许的最大值。从 如果您设置了高度和宽度 打印机驱动程序的属性 不允许删除这些属性 设置时,不会发生错误,并且 这篇论文原封不动。如果你 设置打印机的高度和宽度 只允许某些值的驱动程序
Printer.Height = 2160
Printer.Width = 11900
但它没有任何效果。设置好后,我请求该值,它返回默认值。这是:
Printer.PaperSize = 256
返回一个错误
有什么想法吗?您的打印机不允许设置这些属性,或者您超出了允许的最大值。从 如果您设置了高度和宽度 打印机驱动程序的属性 不允许删除这些属性 设置时,不会发生错误,并且 这篇论文原封不动。如果你 设置打印机的高度和宽度 只允许某些值的驱动程序 如需指定,不会发生错误,并且 属性设置为 司机允许。例如,你可以 将高度设置为150,驾驶员将 设置为144
我不知道为什么将Papersize属性设置为256时会出现错误。它对我有用。此外,还声明,“设置打印机的高度或宽度属性会自动将PaperSize设置为vbPRPSUser。”,等于256。您的打印机不允许设置这些属性,或者您超出了允许的最大值。从 如果您设置了高度和宽度 打印机驱动程序的属性 不允许删除这些属性 设置时,不会发生错误,并且 这篇论文原封不动。如果你 设置打印机的高度和宽度 只允许某些值的驱动程序 如需指定,不会发生错误,并且 属性设置为 司机允许。例如,你可以 将高度设置为150,驾驶员将 设置为144
我不知道为什么将Papersize属性设置为256时会出现错误。它对我有用。此外,还声明,“设置打印机的高度或宽度属性会自动将PaperSize设置为vbPRPSUser。”,等于256。您确定该错误与打印机本身的最大打印宽度无关吗?许多打印机的最大打印宽度为8.25英寸(11880英寸),以便在8.5英寸宽的纸张的任一侧留有1/4英寸的边距 最快的检查方法是简单地将打印宽度设置为11880或更低,然后看看是否有效
另一种可能是对打印机的权限。如果它是共享网络资源,则可能会被锁定。您确定错误与打印机本身的最大打印宽度无关吗?许多打印机的最大打印宽度为8.25”(11880),允许在8.5英寸宽的纸张的任一侧留有1/4英寸的页边距 最快的检查方法是简单地将打印宽度设置为11880或更低,然后看看是否有效
另一种可能是对打印机的权限。如果是共享网络资源,则可能会被锁定。解决方案是使用windows 98。它不适用于win2k,也不适用于winXP。相同的代码,相同的打印机
注意。解决方案是使用windows 98。它不适用于win2k,也不适用于winXP。相同的代码,相同的打印机
问候。我实际上也遇到了同样的问题,但我恰好找到了一个突破。 首先,您需要创建一个自定义表单来定义自定义图纸尺寸。那么,你需要 请参阅Windows API以检查刚刚创建的表单名称。你会得到名字的 从函数返回的数组中,并使用找到表单名称的数组索引。 最后将其用作printer.papersize的值 示例如下:
Public Type PRINTER_DEFAULTS
pDatatype As Long
pDevMode As Long
DesiredAccess As Long
End Type
Public Type FORM_INFO_1
Flags As Long
pName As Long ' String
Size As SIZEL
ImageableArea As RECTL
End Type
Public Declare Function EnumForms Lib "winspool.drv" Alias "EnumFormsA" _
(ByVal hPrinter As Long, ByVal Level As Long, ByRef pForm As Any, _
ByVal cbBuf As Long, ByRef pcbNeeded As Long, _
ByRef pcReturned As Long) As Long
Public Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" _
(pDest As Any, pSource As Any, ByVal cbLength As Long)
Public Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)
Public Declare Function OpenPrinter Lib "winspool.drv" Alias _
"OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _
pDefault As PRINTER_DEFAULTS) As Long
Public Declare Function ClosePrinter Lib "winspool.drv" _
(ByVal hPrinter As Long) As Long
Public Declare Function lstrcpy Lib "KERNEL32" Alias "lstrcpyA" _
(ByVal lpString1 As String, ByRef lpString2 As Long) As Long
'UDF
Public Function PtrCtoVbString(ByVal Add As Long) As String
Dim sTemp As String * 512, x As Long
x = lstrcpy(sTemp, ByVal Add)
If (InStr(1, sTemp, Chr(0)) = 0) Then
PtrCtoVbString = ""
Else
PtrCtoVbString = Left(sTemp, InStr(1, sTemp, Chr(0)) - 1)
End If
End Function
Public Function IsFormExist(ByVal DeviceName As String, ByVal isFormName As String, ByVal PrinterHandle As Long) As Long
Dim NumForms As Long, i As Long
Dim FI1 As FORM_INFO_1
Dim pd As PRINTER_DEFAULTS
Dim aFI1() As FORM_INFO_1 ' Working FI1 array
Dim Temp() As Byte ' Temp FI1 array
Dim FormIndex As Integer
Dim BytesNeeded As Long
Dim RetVal As Long
On Error GoTo cleanup
FormIndex = 0
ReDim aFI1(1)
' First call retrieves the BytesNeeded.
RetVal = OpenPrinter(DeviceName, PrinterHandle, pd)
If (RetVal = 0) Or (PrinterHandle = 0) Then
'Can't access current printer. Bail out doing nothing
Exit Function
End If
RetVal = EnumForms(PrinterHandle, 1, aFI1(0), 0&, BytesNeeded, NumForms)
ReDim Temp(BytesNeeded)
ReDim aFI1(BytesNeeded / Len(FI1))
' Second call actually enumerates the supported forms.
RetVal = EnumForms(PrinterHandle, 1, Temp(0), BytesNeeded, BytesNeeded, _
NumForms)
Call CopyMemory(aFI1(0), Temp(0), BytesNeeded)
For i = 0 To NumForms - 1
With aFI1(i)
If isFormName = PtrCtoVbString(.pName) Then
' Found the desired form
FormIndex = i + 1
Exit For
End If
End With
Next i
IsFormExist = FormIndex ' Returns the number when form is found.
cleanup:
'Release the printer handle
If (PrinterHandle <> 0) Then Call ClosePrinter(PrinterHandle)
End Function
'Here We Go
dim papercode as long, printername as string, formname as string
printername=printer.Devicename
formname = "myform"
papercode=IsFormExist(printername, formname, Printer.hdc)
if papercode<>0 then
printer.papersize=papercode
end if
公共类型打印机\u默认值
pDatatype尽可能长
pDevMode尽可能长
希望尽可能长
端型
公共类型表单信息1
旗子一样长
pName As Long'字符串
大小相同
可成像区域为矩形
端型
公共声明函数EnumForms Lib“winspool.drv”别名“EnumFormsA”_
(ByVal hPrinter尽可能长,ByVal Level尽可能长,ByRef pForm尽可能长_
ByVal cbBuf尽可能长,ByRef PCB尽可能长_
ByRef pcReturned As Long)As Long
公共声明子CopyMemory Lib“KERNEL32”别名“rtlmovemory”_
(pDest为任意,pSource为任意,ByVal cbLength为任意长度)
公共声明子睡眠库“KERNEL32”(ByVal的长度为毫秒)
公共声明函数OpenPrinter Lib“winspool.drv”别名_
“OpenPrinterA”(ByVal名称为字符串,phPrinter长度为_
pDefault作为打印机(默认值)只要
公共声明函数ClosePrinter Lib“winspool.drv”_
(ByVal hPrinter As Long)尽可能长
公共声明函数lstrcpy Lib“KERNEL32”别名“lstrcpyA”_
(ByVal lpString1作为字符串,ByRef lpString2作为长度)作为长度
“UDF
公共函数PtrCtoVbString(ByVal Add As Long)作为字符串
尺寸sTemp为字符串*512,x为长度
x=lstrcpy(sTemp,ByVal Add)
如果(InStr(1,sTemp,Chr(0))=0,则
PtrCtoVbString=“”
其他的
PtrCtoVbString=左(sTemp,InStr(1,sTemp,Chr(0))-1)
如果结束
端函数
公共函数IsFormExist(ByVal DeviceName为字符串,ByVal isFormName为字符串,ByVal PrinterHandle为长)为长
朦胧的身影一样长,我一样长
将图1标注为表格信息1
将pd设置为打印机默认值
Dim aFI1()作为表单_INFO_1'工作FI1数组
Dim Temp()作为字节“Temp FI1数组”
Dim FormIndex作为整数
模糊的字节需要尽可能长的时间
暗淡的后退
关于错误转到清理
FormIndex=0
雷迪姆aFI1(1)
'第一个调用检索所需的字节。
RetVal=OpenPrinter(DeviceName、PrinterHandle、pd)
如果(RetVal=0)或(PrinterHandle=0),则
'无法访问当前打印机。什么也不做就保释出去
退出功能
如果结束
RetVal=EnumForms(PrinterHandle,1,aFI1(0),0&,需要字节,NumForms)
ReDim温度(需要字节)
ReDim aFI1(需要字节/长度(图1))
'第二个调用实际上枚举支持的表单。
RetVal=EnumForms(PrinterHandle,1,Temp(0),需要字节数,需要字节数_
NumForms)
调用CopyMemory(需要aFI1(0)、Temp(0)、Bytes)
对于i=0到NumForms-1
含aFI1(i)
如果isFormName=PtrCtoVbString(.pName),则
'找到所需的形式
FormIndex=