网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Visual Basic
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.VisualBasic中实现绘图区的大十字.
.开启文件属性窗口.
.VB从零开始编外挂(十).
.通往Internet的捷径---捷径档的结.
.通过VisualBasic获取网卡地址.
.VB编程计算农历的计算方法.
.用VB实现文件查找功能.
.利用Internet传输控件来使用FTP.
.使用VisualBasic访问数据库几个注.
.VB中远程共享显示及声音的实现.
.VisualBasic的未来.
.显示数据库记录.
.如何用API定义程序热键.
.保存窗口位置来增加专业性.
.你真正理解AllowUnroundedFloati.
.在VB中使用水晶报表的一种简易编.
.掌握开发的武器-语言.
.用VB编写一个光驱保镖.
.HierarchicalFlexGrid控件的使用.
.计算字符串长度(关于日文字符) .

关于数据报表的打印设置

发表日期:2006-2-27


数据报表(DataReport)是VB6新增功能之一。用过它的朋友对这个设计器可以说是既爱且恨。尽管它功能强大,但却有个非常致命的缺点:无法在设计环境中改变纸张大小及走向。即使你在程序中使用Printer对象改变纸张大小及打印走向,也解决不了问题。对于非A4纸的报表或是横向打印的报表,连报表预览都不行。

问题的原因是:DR基于系统默认的打印设置创建自己的内部设备环境。而这个设备环境是没有向外界展现的。DR的内部设备环境与VB的Printer对象的内部设备环境是完全不同的,因此改变打印机对象的属性对DR一点效果也没有。

解决这个问题的笨办法是,在预览或打印时改变系统默认打印机的设置。使用这个方法连自己都会觉得麻烦,更何况是你的用户。没办法,只能通过代码强行改变系统默认打印机的设置来解决。将下面的代码放入一个模块中:

OptionExplicit

PublicEnumPrinterOrientationConstants
OrientPortrait=1
OrientLandscape=2
EndEnum
PrivateTypeDEVMODE
dmDeviceNameAsString*32
dmSpecVersionAsInteger
dmDriverVersionAsInteger
dmSizeAsInteger
dmDriverExtraAsInteger
dmFieldsAsLong
dmOrientationAsInteger
dmPaperSizeAsInteger
dmPaperLengthAsInteger
dmPaperWidthAsInteger
dmScaleAsInteger
dmCopiesAsInteger
dmDefaultSourceAsInteger
dmPrintQualityAsInteger
dmColorAsInteger
dmDuplexAsInteger
dmYResolutionAsInteger
dmTTOptionAsInteger
dmCollateAsInteger
dmFormNameAsString*32
dmUnusedPaddingAsInteger
dmBitsPerPelAsInteger
dmPelsWidthAsLong
dmPelsHeightAsLong
dmDisplayFlagsAsLong
dmDisplayFrequencyAsLong
EndType
PrivateTypePRINTER_DEFAULTS
pDataTypeAsString
pDevModeAsLong
DesiredAccessAsLong
EndType
PrivateTypePRINTER_INFO_2
pServerNameAsLong
pPrinterNameAsLong
pShareNameAsLong
pPortNameAsLong
pDriverNameAsLong
pCommentAsLong
pLocationAsLong
pDevModeAsLong
pSepFileAsLong
pPrintProcessorAsLong
pDataTypeAsLong
pParametersAsLong
pSecurityDescriptorAsLong
AttributesAsLong
PriorityAsLong
DefaultPriorityAsLong
StartTimeAsLong
UntilTimeAsLong
StatusAsLong
cJobsAsLong
AveragePPMAsLong
EndType

PublicConstDMPAPER_A5=11

PrivateConstDM_IN_BUFFERAsLong=8
PrivateConstDM_OUT_BUFFERAsLong=2
PrivateConstDM_ORIENTATIONAsLong=&H1
PrivateConstDM_PAPERSIZE=&H2&

PrivateConstPRINTER_ACCESS_ADMINISTERAsLong=&H4
PrivateConstPRINTER_ACCESS_USEAsLong=&H8
PrivateConstSTANDARD_RIGHTS_REQUIREDAsLong=&HF0000
PrivateConstPRINTER_ALL_ACCESS=(STANDARD_RIGHTS_REQUIREDOrPRINTER_ACCESS_ADMINISTEROrPRINTER_ACCESS_USE)

PrivateDeclareSubCopyMemoryLib"kernel32"Alias"RtlMoveMemory"(hpvDestAsAny,hpvSourceAsAny,ByValcbCopyAsLong)

PrivateDeclareFunctionOpenPrinterLib"winspool.drv"Alias"OpenPrinterA"(ByValpPrinterNameAsString,phPrinterAsLong,pDefaultAsAny)AsLong

PrivateDeclareFunctionClosePrinterLib"winspool.drv"(ByValhPrinterAsLong)AsLong

PrivateDeclareFunctionDocumentPropertiesLib"winspool.drv"Alias"DocumentPropertiesA"(ByValhWndAsLong,ByValhPrinterAsLong,ByValpDeviceNameAsString,pDevModeOutputAsAny,pDevModeInputAsAny,ByValfModeAsLong)AsLong

PrivateDeclareFunctionGetPrinterLib"winspool.drv"Alias"GetPrinterA"(ByValhPrinterAsLong,ByValLevelAsLong,pPrinterAsAny,ByValcbBufAsLong,pcbNeededAsLong)AsLong

PrivateDeclareFunctionSetPrinterLib"winspool.drv"Alias"SetPrinterA"(ByValhPrinterAsLong,ByValLevelAsLong,pPrinterAsAny,ByValCommandAsLong)AsLong

FunctionSetDefaultPrinterOrientation(ByValeOrientationAsPrinterOrientationConstants)AsBoolean

DimbDevMode()AsByte
DimbPrinterInfo2()AsByte
DimhPrinterAsLong
DimlResultAsLong
DimnSizeAsLong
DimsPrnNameAsString
DimdmAsDEVMODE
DimpdAsPRINTER_DEFAULTS
Dimpi2AsPRINTER_INFO_2

'获取默认打印机的设备名称
sPrnName=Printer.DeviceName
'由于要调用SetPrinter,所以
'如果是在NT下就要求PRINTER_ALL_ACCESS
pd.DesiredAccess=PRINTER_ALL_ACCESS

'获取打印机句柄
IfOpenPrinter(sPrnName,hPrinter,pd)Then
'获取PRINTER_INFO_2结构要求的字节数

CallGetPrinter(hPrinter,2&,0&,0&,nSize)
ReDimbPrinterInfo2(1TonSize)AsByte
lResult=GetPrinter(hPrinter,2,bPrinterInfo2(1),nSize,nSize)
CallCopyMemory(pi2,bPrinterInfo2(1),Len(pi2))
nSize=DocumentProperties(0&,hPrinter,sPrnName,0&,0&,0)
ReDimbDevMode(1TonSize)
Ifpi2.pDevModeThen
CallCopyMemory(bDevMode(1),ByValpi2.pDevMode,Len(dm))
Else
CallDocumentProperties(0&,hPrinter,sPrnName,bDevMode(1),0&,DM_OUT_BUFFER)
EndIf

CallCopyMemory(dm,bDevMode(1),Len(dm))
Withdm
'设置新的走向
.dmOrientation=eOrientation
.dmFields=DM_ORIENTATION
'.dmPaperSize=DMPAPER_A5将纸张大小设为A5,请自行更改所需大小
'.dmFields=DM_PAPERSIZE必须,否则无法设置纸张大小
EndWith
CallCopyMemory(bDevMode(1),dm,Len(dm))

CallDocumentProperties(0&,hPrinter,sPrnName,_
bDevMode(1),bDevMode(1),DM_IN_BUFFEROr_
DM_OUT_BUFFER)

pi2.pDevMode=VarPtr(bDevMode(1))

lResult=SetPrinter(hPrinter,2,pi2,0&)

CallClosePrinter(hPrinter)
SetDefaultPrinterOrientation=True
Else
SetDefaultPrinterOrientation=False
EndIf

EndFunction
在打印或预览之前直接调用SetDefaultPrinterOrientation打印走向常数。注意:红色注释部分用于改变纸张的大小。

这个解决方案仍有两个问题:

1。对有些型号的打印机不起作用,例如佳能的BJC-265SP
2。即使是在预浏DR时,也必须改变打印机的设置。这时如果有其它使用打印机默认设置的程序(如Notepad)要进行打印作业,就可能造成混乱。


尽管如此,这个方法是目前唯一好用的方法。->

上一篇:如何用VB访问外来数据库 人气:3424
下一篇:建立、改变及重构Access数据库 人气:3399
浏览全部Visual Basic的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐