很久以来,关于VFP打印的纸张设置一直是个难题。也有很多这方面的贴子。其实他们也解决了大部分问题。只是没有归纳起来。“童心未免”的win2000/xp纸张设置,“李彤”的在Visual FoxPro 6中动态修改打印纸张大小(win98),他们都解决了在win2000\\xp\\98中自定义纸张的设置问题。我在他们的基础上稍作归纳,加上了一点自己的想法,做成了一个类。可以自己根据系统设置自定义纸张。
其中heap类就是“童心未免”的,函数setwin98_page就是“李彤”的。当然我在他们的基础上根据我的想法做了一定的修改。
整个调用是这样的:在主程序中先建立heap类实列(如Oheap)(也可以将heap添加到表单),在表单中添加Myplt类
表单在打印或预览时代码如下:
oApp.setpage(\"FHMX\",this.pageWidth,this.pagehight)
(报表文件名,宽度(mm),宽度(mm))
*设置预览尺寸(cm)
IF this.pagehight>0 AND this.pageWidth>0
this.myplt1.sheight=this.pagehight/10
this.myplt1.swidth =this.pageWidth/10
ELSE
this.myplt1.sheight=29.7
this.myplt1.swidth =21
ENDIF
this.myplt1.ListenerType=1
loreport=.NULL.
DO (_REPORTPREVIEW) WITH loreport
WITH loreport
.Caption = \"订单预览\"
.ZoomLevel = 4 && 75%
.CanvasCount = 1
ENDWITH
this.myplt1.PreviewContainer =loreport
REPORT FORMreports\\fhmx TO PRINTER Object this.myplt1
可能里面有些代码有问题,因为它是和我的程序配合使用的,我开始并没有单独做,才整理的,没做测试。但里面的代码没有原则问题。我在win2000\\xp\\98都作了测试。如果有问题,稍做改动就可以了,我想各位没问题。
VFP进行系统打印机的走向和纸张设置
时间:2012-11-2519:26:34 点击: 231
核心提示:用SetPrinter来进行系统打印机的走向和纸张设置...
*----------------------------声明--------------------------------*
DECLARE INTEGER OpenPrinter INwinspool.drv;
STRING pPrinterName,INTEGER @phPrinter, INTEGER pDefault
DECLARE INTEGER GetProfileString IN kernel32;
STRING lpApp, STRINGlpKey, STRING lpDefault,;
STRING @lpReturnedString,INTEGER nSize
DECLARE INTEGER ClosePrinter IN winspool.drv INTEGER hPrinter
DECLARE INTEGER DocumentProperties IN winspool.drv;
INTEGER hWnd, INTEGERhPrinter, STRING pDeviceName,;
STRING @pDevModeOutput,STRING @pDevModeInput, INTEGER fMode
DECLARE INTEGER SetPrinter IN winspool.drv;
INTEGER hPrinter,;
INTEGER lvl,;
STRING @ pPrinter,;
INTEGER cmd
DECLARE INTEGER GetPrinter IN winspool.drv AS GetPrinterA;
INTEGER hPrinter,;
INTEGER Lvl,;
STRING @pPrinter,;
INTEGER cbBuf,;
INTEGER@ pcbNeeded
*----------------------------实例--------------------------------*
nOrient=2&&横向
PaperSize=0x0B&& A5
nSize=0
lcBuffer = Repli(Chr(0), 120)
GetProfileString("Windows", "Device",",,,", @lcBuffer, Len(lcBuffer))
lcBuffer = STRTRAN(lcBuffer, Chr(0), "")
cPrinter = SUBSTR(lcBuffer, 1, AT(",", lcBuffer, 1)-1)&&系统当前默认打印机名称
hPrinter = 0
OpenPrinter(cPrinter,@hPrinter,0)
nBufsize = DocumentProperties(0, hPrinter,cPrinter,0,0,0)
GetPrinterA(hPrinter,2,0,0,@nSize)
pPrinter=REPLICATE(CHR(0),nSize)
GetPrinterA(hPrinter,2,@pPrinter,nSize,@nSize)
s=CTOBIN(SUBSTR(pPrinter,29,4),'4rs')
cDevmode=SYS(2600,s,nBufsize)&&读取Devmode结构
aDevmode=AT(cDevmode,pPrinter)&&找出Devmode结构在PRINTER_INFO_2中的位置
&&设置新的走向,就是把PRINTER_INFO_2中的Devmode结构中的走向改掉
pPrinter=STUFF(pPrinter,aDevmode+44,1,CHR(nOrient))
pPrinter=STUFF(pPrinter,aDevmode+76,1,CHR(nOrient))
&&纸张就是把PRINTER_INFO_2中的Devmode结构中的纸张改掉
pPrinter=STUFF(pPrinter,aDevmode+46,1,CHR(PaperSize))
pPrinter=STUFF(pPrinter,aDevmode+78,1,CHR(PaperSize))
SetPrinter(hPrinter,2,@pPrinter,0)
ClosePrinter(hPrinter)
再打开控制面板中的默认打印机看看是不是走向和纸张都变了?
VFP更改当前程序打印机的打印方向
时间:2012-11-2519:24:10 点击: 41
核心提示:用DocumentProperties函数来更改当前程序打印机的打印方向:程序代码如下...
用DocumentProperties函数来更改当前程序打印机的打印方向:
*-----------------------------------------------------------------*
*-VFP应用程式算法群*
*-----------------------------------------------------------------*
*----------------------------声明--------------------------------*
DECLARE INTEGER OpenPrinter INwinspool.drv;
STRING pPrinterName,INTEGER @phPrinter, INTEGER pDefault
DECLARE INTEGER GetProfileString IN kernel32;
STRING lpApp, STRINGlpKey, STRING lpDefault,;
STRING @lpReturnedString,INTEGER nSize
DECLARE INTEGER ClosePrinter IN winspool.drv INTEGER hPrinter
DECLARE INTEGER DocumentProperties IN winspool.drv;
INTEGER hWnd, INTEGERhPrinter, STRING pDeviceName,;
STRING @pDevModeOutput,STRING @pDevModeInput, INTEGER fMode
DECLARE INTEGER SetPrinter IN winspool.drv;
INTEGER hPrinter,;
INTEGER lvl,;
STRING @ pPrinter,;
INTEGER cmd
DECLARE INTEGER GetPrinter IN winspool.drv AS GetPrinterA;
INTEGER hPrinter,;
INTEGER Lvl,;
STRING @pPrinter,;
INTEGER cbBuf,;
INTEGER@ pcbNeeded
*----------------------------实例--------------------------------*
#DEFINE IDCANCEL 2&&横向
#DEFINE DM_OUT_BUFFER 2
#DEFINE DM_IN_BUFFER 8
#DEFINE DM_IN_PROMPT 4
local hWindow, cPrinter, cDriver, cPort, hPrinter, nBufsize, cDevmode
APRINTERS(gaPrinters)&&改函数用来获取VFP默认打印机名称,注意vfp默认并不代表系统全局默认。
cPrinter=gaPrinters(1,1)
hPrinter = 0
OpenPrinter(cPrinter,@hPrinter,0)
IF hPrinter = 0
Messagebox("不能打开默认打印机!", 48, "错误")
RETURN
ENDIF
nBufsize = DocumentProperties(hWindow, hPrinter, cPrinter,0,0,0)&&获取DEVMODE结构大小
cDevmode = Repli(Chr(0), nBufsize)
nOrient= DMORIENT_LANDSCAPE&&横向
DocumentProperties(hWindow, hPrinter, cPrinter, @cDevmode, 0,DM_OUT_BUFFER)&&获取DEVMODE结构缓冲区字串
cDevmode=SUBSTR(cDevmode,1,44)+BINTOC(nOrient,'2rs')+SUBSTR(cDevmode,47,nBufsize-47)&&更改DEVMODE结构中打印走向的部分
DocumentProperties(hWindow, hPrinter, cPrinter,@cDevmode,@cDevmode,DM_IN_BUFFER+DM_OUT_BUFFER)&&更新打印机DEVMOD
DocumentProperties(hWindow, hPrinter, cPrinter, @cDevmode, @cDevmode,DM_IN_PROMPT+DM_IN_BUFFER+DM_OUT_BUFFER)&&看看变了没
ClosePrinter(hPrinter)
这样设置打印机是不是很简单?如果在VFP中测试本段代码会发现在vfp中打印机设置确实变了,但在控制面板中并没有变,这就是所谓的
DocumentProperties函数是用来设置当前单一程序的打印机。
VFP更改当前程序打印机的打印方向
时间:2012-11-2519:24:10 点击: 41
核心提示:用DocumentProperties函数来更改当前程序打印机的打印方向:程序代码如下...
用DocumentProperties函数来更改当前程序打印机的打印方向:
*-----------------------------------------------------------------*
*-VFP应用程式算法群*
*-----------------------------------------------------------------*
*----------------------------声明--------------------------------*
DECLARE INTEGER OpenPrinter INwinspool.drv;
STRING pPrinterName,INTEGER @phPrinter, INTEGER pDefault
DECLARE INTEGER GetProfileString IN kernel32;
STRING lpApp, STRINGlpKey, STRING lpDefault,;
STRING @lpReturnedString,INTEGER nSize
DECLARE INTEGER ClosePrinter IN winspool.drv INTEGER hPrinter
DECLARE INTEGER DocumentProperties IN winspool.drv;
INTEGER hWnd, INTEGERhPrinter, STRING pDeviceName,;
STRING @pDevModeOutput,STRING @pDevModeInput, INTEGER fMode
DECLARE INTEGER SetPrinter IN winspool.drv;
INTEGER hPrinter,;
INTEGER lvl,;
STRING @ pPrinter,;
INTEGER cmd
DECLARE INTEGER GetPrinter IN winspool.drv AS GetPrinterA;
INTEGER hPrinter,;
INTEGER Lvl,;
STRING @pPrinter,;
INTEGER cbBuf,;
INTEGER@ pcbNeeded
*----------------------------实例--------------------------------*
#DEFINE IDCANCEL 2&&横向
#DEFINE DM_OUT_BUFFER 2
#DEFINE DM_IN_BUFFER 8
#DEFINE DM_IN_PROMPT 4
local hWindow, cPrinter, cDriver, cPort, hPrinter, nBufsize, cDevmode
APRINTERS(gaPrinters)&&改函数用来获取VFP默认打印机名称,注意vfp默认并不代表系统全局默认。
cPrinter=gaPrinters(1,1)
hPrinter = 0
OpenPrinter(cPrinter,@hPrinter,0)
IF hPrinter = 0
Messagebox("不能打开默认打印机!", 48, "错误")
RETURN
ENDIF
nBufsize = DocumentProperties(hWindow, hPrinter, cPrinter,0,0,0)&&获取DEVMODE结构大小
cDevmode = Repli(Chr(0), nBufsize)
nOrient= DMORIENT_LANDSCAPE&&横向
DocumentProperties(hWindow, hPrinter, cPrinter, @cDevmode, 0,DM_OUT_BUFFER)&&获取DEVMODE结构缓冲区字串
cDevmode=SUBSTR(cDevmode,1,44)+BINTOC(nOrient,'2rs')+SUBSTR(cDevmode,47,nBufsize-47)&&更改DEVMODE结构中打印走向的部分
DocumentProperties(hWindow, hPrinter, cPrinter,@cDevmode,@cDevmode,DM_IN_BUFFER+DM_OUT_BUFFER)&&更新打印机DEVMOD
DocumentProperties(hWindow, hPrinter, cPrinter, @cDevmode, @cDevmode,DM_IN_PROMPT+DM_IN_BUFFER+DM_OUT_BUFFER)&&看看变了没
ClosePrinter(hPrinter)
这样设置打印机是不是很简单?如果在VFP中测试本段代码会发现在vfp中打印机设置确实变了,但在控制面板中并没有变,这就是所谓的
DocumentProperties函数是用来设置当前单一程序的打印机。
联系客服