| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1334 人关注过本帖
标题:VFP 设置打印机纸张以及横向纵向显示。
只看楼主 加入收藏
weiyisc
Rank: 2
等 级:论坛游民
帖 子:103
专家分:14
注 册:2009-5-17
结帖率:83.33%
收藏
已结贴  问题点数:6 回复次数:10 
VFP 设置打印机纸张以及横向纵向显示。
如题:
VFP 设置打印机纸张以及横向纵向显示。

ps:不是打印vfp报表,是直接修改默认打印机的纸张设置。不知道能否实现?

望指教。。。。。
搜索更多相关主题的帖子: 打印机 VFP 纵向 横向 显示 
2022-06-08 16:53
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10537
专家分:42927
注 册:2014-5-20
收藏
得分:2 
系统级主要调用winspool.drv库的几个API:
OpenPrinter
GetProfileString
ClosePrinter
DocumentProperties
SetPrinter
GetPrinter
2022-06-09 11:59
weiyisc
Rank: 2
等 级:论坛游民
帖 子:103
专家分:14
注 册:2009-5-17
收藏
得分:0 
有这几个函数使用实例吗?
2022-06-09 18:40
zhken
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:283
专家分:616
注 册:2012-9-21
收藏
得分:2 
初学者对这方面是不容易实现的,即使比较熟练的仍然有一定的难度

网上有一些例子,能不能看懂,我个人认为 结合EXCEL 来输出并控制纸张大小及方向 更为简便实现

如果以下能弄懂,可以尝试一下

VFP下打印机的设置编程
 
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
2022-06-09 21:41
gs2536785678
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:45
帖 子:601
专家分:1770
注 册:2017-7-16
收藏
得分:2 
确实 ,一般来说,你只要弄好报表,设置好打印方向就可以了,至于深入到里面,太难了。。。
2022-06-10 10:13
weiyisc
Rank: 2
等 级:论坛游民
帖 子:103
专家分:14
注 册:2009-5-17
收藏
得分:0 
回复 4楼 zhken
感谢感谢!。一个特殊需求。如果是vfp报备不存在这些问题
2022-06-10 10:31
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10537
专家分:42927
注 册:2014-5-20
收藏
得分:0 
以下是引用weiyisc在2022-6-9 18:40:53的发言:

有这几个函数使用实例吗?

为什么要在程序中修改系统的默认打印设置? 会否对其他应用有影响。
实例可以搜索一下,应该有不少相关示例代码可以参考。
2022-06-10 18:11
talkrobin
Rank: 2
等 级:论坛游民
帖 子:38
专家分:19
注 册:2022-5-15
收藏
得分:2 
回复 4楼 zhken
厉害, 我仔细看看, 不知道自己是否可以学会
2022-06-10 19:17
zhken
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:283
专家分:616
注 册:2012-9-21
收藏
得分:0 
还有一种简单的方法。就是在调用时手工选择设置:试试能否解决

USE 报表.frx EXCLUSIVE &&是报表页面设置,要求独占打开报表文件。
aaa=SYS(1037, 1) &&当成功设置了返回1,否则返回0. ? aaa

其他页面相关数据纸张类型,纵向(横向)等,参考VFP帮助 PRTINFO() 函数,有详细说明
2022-06-11 22:56
gs2536785678
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:45
帖 子:601
专家分:1770
注 册:2017-7-16
收藏
得分:0 
简单点:
MODIFY REPORT .\aform\pb1.frx
就可以在程序运行姿态下,打开报表设计器进行各种操作了。

[此贴子已经被作者于2022-6-14 10:48编辑过]

2022-06-14 10:47
快速回复:VFP 设置打印机纸张以及横向纵向显示。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015873 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved