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=