首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

在VFP中用程序向操作系统添加自定义纸张,该如何解决

2012-02-20 
在VFP中用程序向操作系统添加自定义纸张我正在编写一个收费管理程序,要打印发票(以填充的方式),请问:在VFP

在VFP中用程序向操作系统添加自定义纸张
我正在编写一个收费管理程序,要打印发票(以填充的方式),请问:在VFP中用程序代码向操作系统添加自定义纸张?
        不是“win2000   或XP   请通过,打印机--> 服务器属性--> 格式--> 创建新格式--> 保存格式,转到VFP,报表--> 页面设置-选择自定义的纸张格式”这种方式添加自定义纸张。
        望大侠们多多指点,谢谢!!!!


[解决办法]
转帖:

Windows 2000/XP下添加/删除自定义纸张的过程(可返回添加纸的id)
*--------------------------------

关于自定义打印纸的问题,论坛上有很多讨论,我知道mihu版主曾经发表过如何返回添加自定义纸的id的讨论。但都是没有比较完整的解决方法,我因为客户的需要,经过研究摸索,终于找到以下的方法解决,首先说明以下这段代码不是我的原创,我参考了网上收集回来的资料,加以整理,做成一个过程,使其可以带参数调用和返回添加纸的id(原来的代码没有返回值及不带参数)有了这个id号,那么在Win2000/xp下控制即打即停就可以解决了,我们可以根据打印的记录数计算出需要的打印纸长度,宽度一般是固定的,打印前调用该过程先添加自定义的打印纸(添加前会删除相同名称的打印纸),然后将报表的PAPERSIZE设为新添加的打印纸id即可。至于在Win98系统下更加简单,只需将报表的PAPERSIZE设为256,PAPERLENGTH设为需要的打印纸长度即可
你可以复制/粘贴以下代码,如有问题欢迎发贴讨论
*------------------------------------------------
*在 Windows 2000/XP 下添加/删除自定义纸张的示例代码
*调用方法:addpaper( "自定义纸名 ",纸的宽度,纸的长度) 单位为0.1毫米
*返回值:如果添加成功则返回一个大于0的数值,这就是添加纸的id号.
Lpara lcformname,lnWidth,lnLength
Local lcformname,lnWidth,lnLength,oldalias ,lcstr,lcprinter,lcport
If pcount() <3
*msg( "参数缺少! ")
Return -1
Endif
lnLength=lnLength*100
lnWidth=lnWidth*100
Clea Dlls
Set Safety Off
oldalias = Alias()
Create Table killyou Free (dummy cdbuf(1))
Create Report killyou From killyou.Dbf
Use killyou.frx Alias killyou
lcstr = Expr
If Empty(lcstr)
Use In killyou
Delete File killyou.frx
Delete File killyou.frt
Delete File killyou.Dbf
If !Empty(oldalias)
Select (oldalias)
Endif
*msg( "你的系统中没有安装打印机! ")
Return -2
Endif
Store Memlines(Expr) To gnnumlines
lcprinter = " "
lcport = " "
For gncount = 1 To gnnumlines
If At( "DEVICE= ",Mline(Expr,gncount)) <> 0
lcprinter = Substr(Mline(Expr,gncount),8)
Endif
If At( "OUTPUT ",Mline(Expr,gncount)) <> 0
lcport = Substr(Mline(Expr,gncount),8)
Endif
Next
If Empty(lcport)
Use In killyou
Delete File killyou.frx
Delete File killyou.frt
Delete File killyou.Dbf
If !Empty(oldalias)
Select (oldalias)
Endif
*msg( "当前打印机不是本地打印机! ")
Return -3
Endif
Use In killyou
Delete File killyou.frx
Delete File killyou.frt
Delete File killyou.Dbf
*----------------------------
Declare Integer OpenPrinter In WinSpool.Drv As WS_OpenPrinter ;
string pPrinterName, ;
integer @phPrinter, ;
string pDefault
Declare Integer DocumentProperties In WinSpool.Drv ;
integer, ;
integer, ;
string, ;
string, ;
string, ;
integer
Declare Integer ClosePrinter In WinSpool.Drv As WS_ClosePrinter ;
integer hPrinter
Declare Integer EnumForms In WinSpool.Drv ;
Integer, ;
Integer, ;
String @, ;
Integer , ;
Integer @, ;
Integer @
Declare Integer AddForm In WinSpool.Drv ;
integer, ;
integer, ;
string
Declare Integer DeleteForm In WinSpool.Drv ;
integer, ;
string
Declare Long CreateDC In gdi32.Dll ;
string @cDriver, ;
string @cDevice, ;
string cOutput, ;
string cInitData
Declare Long DeleteDC In gdi32.Dll ;
declare Long ResetDC In gdi32.Dll ;
integer, ;
string
Declare RtlMoveMemory In kernel32 As CopyMemory;
string @ Destination,;
integer Source,;
integer nLength
Declare Integer lstrcpy In kernel32.Dll ;
integer lpString1, String @lpString2


Declare Integer GetForm In WinSpool.drv ;
integer,;
string, ;
integer,;
string, ;
integer,;
integer
Declare Integer SetForm In WinSpool.drv ;
integer,;
string,;
integer,;
string
oheap = Createobj( "Heap ")
*----------------------------------------------------
revalue = getprintersettings(lcprinter,lcformname,lnWidth,lnLength)
Clear Dlls
Return revalue
*----------------------------------------------------
Function getprintersettings
Lpara lcprinter,lcformname,lnLength,lnWidth
Local lcprinter,lcformname,lnLength,lnWidth,hprinter ,nsize ,bytesneeded ,numforms, formname,retval
Local nstringbase , ns,bc,temp
hprinter = 0
nsize = 0
bytesneeded = 0
numforms = 0
If ws_openprinter(lcprinter, @hprinter, 0) <> 0 Then
formname=lcformname + Chr(0) + Chr(0)
* 删除自定义纸张
retval = deleteform(hprinter,lcformname)
If retval = 0 Then
*msg( "删除自定义纸张时了生错误! ")
Endif
nstringbase = oheap.allocblob(formname)
* 添加自定义纸张
retval = addform(hprinter,1,numtodword(0)+numtodword(nstringbase)+numtodword(lnLength)+numtodword(lnWidth)+numtodword(0)+numtodword(0)+numtodword(lnLength)+numtodword(lnWidth))
If retval = 0 Then
*msg( "添加自定义纸张时发生了错误! ")
Return 0
Endif
*------------------------------------
ns=Replicate(Chr(0), 32)
retval = enumforms(hprinter, 1, @ns, 0, @bytesneeded, @numforms)
*Return iif(retval = 0,retval,numforms)
bc=bytesneeded
temp=Replicate(Chr(0), bc)
retval = enumforms(hprinter, 1, @temp, bc , @bytesneeded, @numforms)
*-------------------------------------
=ws_closeprinter(hprinter)

Return iif(retval = 0,retval,numforms)
Else
*msg( "打开打印机出错! ")
Return -4
Endif
*----------------------------------------------------

[解决办法]
我自已写了个DLL,非常好用的,可以直接新增自定义纸张,并且返回ID

热点排行