VFP下打印机的设置编程
2008-09-29 13:03
VFP本身提供了部分相关打印机的数据返回函数以及部分设置项,但在打印机的直接控制方面没有提供
相应的策略,这里从分析打印机的Devmode和PRINTER_INFO_2的结构来详细说明一下VFP打印机的相关操作编程。首先看下打印机的基本数据结构Devmode:

Private Type DEVMODE
    dmDeviceName As String * 32 &&打印设备名称,每个打印机驱动程序都有一个唯一的字符串。
    dmSpecVersion As Integer     &&指定 Win32 软件开发工具包中 DEVMODE 结构的版本号。
    dmDriverVersion As Integer   &&指定由打印机驱动程序开发商分配的打印机驱动程序版本号。
    dmSize As Integer            &&指定 DEVMODE 结构的字节大小。
    dmDriverExtra As Integer     &&指定设备的数据可选 dmDriverData 成员的字节大小。
    dmFields As Long             &&指定 DEVMODE 结构中的哪些其余成员已被初始化。
    dmOrientation As Integer     &&指定纸张的方向。它可以为 1(纵向)或 2(横向)。
    dmPaperSize As Integer       &&指定打印的纸张大小。
    dmPaperLength As Integer     &&替代由PaperSize成员为自定义纸张大小的高度,PaperSize为0或256时有效。
    dmPaperWidth As Integer      &&代由PaperSize成员为自定义纸张大小的宽度,PaperSize为0或256时有效。
    dmScale As Integer           &&指定打印输出的缩放系数,输出的纸张大小是按缩放值/100从实际纸张大小缩放得到的。
    dmCopies As Integer          &&指定打印份数(如果打印设备支持多页打印)。
    dmDefaultSource As Integer   &&指定送纸的默认纸盒。
    dmPrintQuality As Integer    &&指定打印机的分辨率。值: -4高品质、-3中品质、-2低品质和 -1草稿。
    dmColor As Integer           &&指定是否以彩色打印输出结果。值为 1(彩色)和 2(单色)。
    dmDuplex As Integer          &&指定是否在纸张的双面打印输出结果。1单面、2水平、3垂直。(需要打印机支持)
    dmYResolution As Integer     &&指定打印机的 y 方向分辨率(以每英寸点数 (dpi) 为单位)。
    dmTTOption As Integer        &&指定如何打印 TrueType 字体。
    dmCollate As Integer         &&指定在打印多份时是否使用逐份打印。
    dmFormName As String * 32    &&指定要使用的纸张大小;例如,“Letter”或“Legal”。
    dmUnusedPadding As Integer   &&用于在将来的版本中填充空格、字符或数值。
    dmBitsPerPel As Integer      &&指定显示设备的颜色分辨率(以每像素的位数为单位)。
    dmPelsWidth As Long          &&指定可见设备表面(屏幕或打印机)的宽度(以像素为单位)。
    dmPelsHeight As Long         &&指定可见设备表面(屏幕或打印机)的高度(以像素为单位)。
    dmDisplayFlags As Long       &&指定设备的显示模式。
    dmDisplayFrequency As Long   &&指定显示设备在特定模式下的频率(以赫兹(每秒周数)为单位)。
End Type

从上面的Devmode的结构我们可以看出,该结构几乎囊口了打印机设置的全部参数,那么我们在进行打印机的相关
编程设计时只要改变该结构的相关参数值就可以了,而且打印机的专用动态连接库winspool.drv也为我们提供了
两个相关的设置函数:DocumentProperties和SetPrinter,我们先看下这两个函数的VFP声明及相关说明:
DECLARE INTEGER DocumentProperties IN winspool.drv;
                INTEGER hWnd,;
                INTEGER hPrinter,;
                STRING pDeviceName,;
                STRING @pDevModeOutput,;
                STRING @pDevModeInput,;
                INTEGER fMode
说明:  
这是一个灵活的打印机配置控制函数。该函数定义了两个DEVMODE结构,可在创建一个设备场景时为单个应用程序改变
打印机设置。甚至能在文档打印期间改变打印机设置 。
返回值:  
Long,由fMode字段的值决定。如下所示:  
若fMode为零,这个函数就返回DEVMODE结构的尺寸。注意这个结构可能比类型定义文件API32.TXT中规定的尺寸大  
若fMode设置了DM_IN_PROMPT标志,那么打印机设置对话框就会出现。在这种情况下,
返回值将是常数IDOK 或IDCANCEL——具体由用户关闭对话框时按下的按钮决定  
在其他任何情况下,该函数执行成功后会返回IDOK。而在任何情况下,如函数执行失败,都会返回一个负数 。
参数表     
参数             类型 及说明     
hwnd             Long,对话框父窗口的句柄。这通常是当前的活动窗体     
hPrinter         Long,一个已打开的打印机对象的句柄     
pDeviceName      String,打印机的名字     
pDevModeOutput   Long,指向一个DEVMODE数据结构的指针。请参考DocumentProperties运行模式表。
注意这个指针必须引用一个足够大的缓冲区,它能同时容下专用打印机驱动程序数据,以及标准的DEVMODE结构    
pDevModeInput   Long,指向一个DEVMODE数据结构的指针。请参考DocumentProperties运行模式表     
fMode   Long,决定这个函数运作模式的一个标志。请参考DocumentProperties运行模式表。

这个函数应当注意的一点就是它是设置针对当前的单个应用程序有效的,如果要设置全局有效则使用SetPrinter函数。
我们再看下SetPrinter的声明:
DECLARE INTEGER SetPrinter IN winspool.drv;
        INTEGER hPrinter,;
        INTEGER lvl,;
        STRING @ pPrinter,;
        INTEGER cmd
说明
对一台打印机的状态进行控制
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表 参数 类型及说明
hPrinter Long,指定一个已打开的打印机的句柄(用OpenPrinter取得)
Level Long,0,2或3(4或5用于windows95,5或6用于NT 4.0)。如Command不是零,则这个参数必须是零
pPrinter Byte,包含一个PRINTER_INFO_x的结构的缓冲区,其中的x代表级别的设定(Level)。
Command Long,下述值之一:                   
零 根据PRINTER_INFO_x结构改变打印机
PRINTER_CONTROL_PAUSE 暂停打印机
PRINTER_CONTROL_PURGE 删除打印机的所有作业
PRINTER_CONTROL_RESUME 恢复一台暂停的打印机
PRINTER_CONTROL_SET_STATUS 载入打印机的PRINTER_CONTROL_STATUS结构(不可在NT 3.51下使用)
注解
在PRINTER_INFO_2结构的基础上设置打印机状态时,pServerName,AveragePPM,Status和cJobs字段都会被忽略

改函数被用来对某一打印机进行一个全局设置。
改函数引用了一个在PRINTER_INFO_X结构,起结构定义如下:
Type PRINTER_INFO_2
    pServerName As Long
    pPrinterName As Long
    pShareName As Long
    pPortName As Long
    pDriverName As Long
    pComment As Long
    pLocation As Long
    pDevMode As Long   &&DevMode结构指针
    pSepFile As Long
    pPrintProcessor As Long
    pDataType As Long
    pParameters As Long
    pSecurityDescriptor As Long
    Attributes As Long
    Priority As Long
    DefaultPriority As Long
    StartTime As Long
    UntilTime As Long
    Status As Long
    cJobs As Long
    AveragePPM As Long
End Type

OK!现在我们就可以来根据这两个结构来定义自己的打印机了,首先我们先看下如何用DocumentProperties函数和DEVMODE
结构来定义当前程序的打印机:

本篇文章所需要的API声明:

DECLARE INTEGER OpenPrinter IN winspool.drv;
         STRING pPrinterName, INTEGER @phPrinter, INTEGER pDefault
DECLARE INTEGER GetProfileString IN kernel32;
         STRING lpApp, STRING lpKey, STRING lpDefault,;
         STRING @lpReturnedString, INTEGER nSize
DECLARE INTEGER ClosePrinter IN winspool.drv INTEGER hPrinter
DECLARE INTEGER DocumentProperties IN winspool.drv;
         INTEGER hWnd, INTEGER hPrinter, 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

示例1:用DocumentProperties函数来更改当前程序打印机的打印方向:
*-----------------------------------------------------------------*
*-VFP应用程式算法群:12787940 行者孙:310727570-*
*-----------------------------------------------------------------*
#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函数是用来设置当前单一程序的打印机。
OK,接下来我们再利用SetPrinter来设置系统打印机:
示例2:用SetPrinter来进行系统打印机的走向和纸张设置
*-----------------------------------------------------------------*
*-VFP应用程式算法群:12787940 行者孙:310727570-*
*-----------------------------------------------------------------*
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)

再打开控制面板中的默认打印机看看是不是走向和纸张都变了?
就这么简单,大家可以利用Devmode结构设计出几乎包括打印机设置参数的程式。

VFP下打印机的设置编程相关推荐

  1. 计算机睡眠打印机不可用设置,win7系统下打印机属性显示不可用如何解决

    打印机是办公室人员经常会用到的打印设备,然而有不少win7 32位系统用户在安装网络打印机之后,会遇到无法正常打印的情况,然后打开打印机属性显示不可用,该怎么处理呢?现在就随win7之家小编一起来看看 ...

  2. Qt在Windows下的三种编程环境搭建

    未经验证,记录在此. 尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/17363165 从QT官网可以得 ...

  3. 打印机设置虚拟服务器,虚拟机打印机服务器设置

    虚拟机打印机服务器设置 内容精选 换一换 迁移前,您需要设置目的端服务器.该目的端用来接收源端的数据,同时您也可以使用该目的端进行迁移测试和启动目的端.只有"迁移阶段"为" ...

  4. Windows下C语言网络编程快速入门

    C语言的学习,一般的方式是,先学C,然后是C++,最好还要有汇编语言和微机原理基础,然后才是Visual C++.这样的方式,对学习者来说,要花费很多时间和耐力.而在学校教学中,也没有时间深入学习Wi ...

  5. 怎么设置计算机网络打印机共享,打印机共享设置,告诉你打印机共享怎么设置...

    我们办公室里面的打印机一般都是只配备一台或两台电脑,安装打印机共享之后就是大家的电脑一起共用这个打印机了,通过电脑共享打印的话就要一直开着那台共享的电脑,不然关机就不能打印了,现在小编就跟大家分享一下 ...

  6. win7设置计算机共享的打印机共享的打印机共享,告诉你win7打印机共享设置教程...

    win7打印机共享怎么设置呢?我们在办公的过程中经常都需要打印一些资料之类的东西,如果我们跑来跑去就会浪费我们宝贵的时间,我们这时就可以使用打印机共享设置的方法,接下来,小编就给大家陈述一下win7打 ...

  7. css不换行省略号 没作用,flex布局下,css设置文本不换行时,省略号不显示的解决办法...

    大致是有一个 main 容器是 flex 布局,左边一个 logo 固定宽高,右边 content 动态宽度. a name a info Lorem ipsum dolor sit amet, co ...

  8. 无线路由器打印机服务器设置,newifi新路由打印机服务器设置全教程

    newifi新路由打印机服务器设置全教程 newifi新路由打印机服务器设置全教程 newifi mini一个USB口,接移动硬盘是必然的,如果再接打印机,必须加hub. 那如何设置呢? 首先,new ...

  9. 分机计算机怎么设置共享打印机,win7打印机共享设置分机怎么设置

    通过设置防火墙开启"文件和打印机共享".具体方法:依次进入"控制面板"->"系统各安全"->"Windows防火墙&q ...

最新文章

  1. spring beans源码解读之--BeanFactory的注册
  2. BZOJ-3190-赛车-JLOI2013-暴力枚举
  3. java中的Cookie是什么_第74节:Java中的Cookie和Session
  4. Eigen(7)Map类
  5. oracle分区表扩分区 很慢,升级oracle10g 大分区表update变慢
  6. java 线程状态_浅析Java中的线程状态
  7. BootstrapTable分页参数
  8. Windows 平台安装 MongoDB
  9. PostgreSQL在何处处理 sql查询之五十四
  10. python是什么 自学-你是如何自学 Python 的?
  11. 西威变频器avo下载调试资料_免费下载 |《西门子全集成自动化技术》,很全很详细...
  12. 树莓派导入h5模型出错OSError: SavedModel file does not exist at: model.h5/{saved_model.pbtxt|saved_model.pb}
  13. Field _II 仿真 学习笔记
  14. linux怎么取消光盘,怎样取消ubuntu官方光盘
  15. 我的求学十年(00至10):从中学到大学,年少轻狂立大志
  16. python分号_在Python中拆分分号分隔的字符串
  17. 卡内基梅隆大学计算机专业介绍,卡内基梅隆大学计算机专业介绍 全美大学计算机专业榜首...
  18. Revo Uninstaller Pro(软件卸载工具)官方中文版V4.4.2.0 | 万能卸载软件下载 | 软件卸载工具哪个好?
  19. kafka 中如何保证数据消息不丢失
  20. ssh海思3531a开发板的交叉编译

热门文章

  1. TSC打印机驱动问题
  2. 零元学Expression Design 4 - Chapter 7 使用内建功能「Clone」来达成Path的影分身之术...
  3. asp.net 微信jsapi支付
  4. 计算三角形面积 java_java 三角形面积计算(文件读取)
  5. unity碰撞检测的几种函数
  6. 小米2019秋招软件开发笔试题A选择部分解析
  7. Mac系统原生支持NTFS格式硬盘
  8. Golang postgres.go:45:3: unknown field ‘WithReturning‘ in struct literal of type....
  9. 优维EasyOps,打造新一代运维新方式
  10. 【Hive】Hive练习题(一)